elasticsearch - ElasticSearch:关键字数据类型字段与值数组完全匹配

标签 elasticsearch kibana elasticsearch-6.5

在ElasticSearch中,我为电子邮件字段和标题字段提供了映射,如下所示:

  {
  "person": {
    "mappings": {
      "_doc": {
         "email": {
           "type": "keyword",
           "boost": 80
          },
          "title": {
          "type": "text",
           "boost": 70
          }
       }
     }
   }
 
每个人可以拥有多个电子邮件地址和标题。因此,我将值存储在数组中。
我使用query_string搜索具有电子邮件地址和/或标题的人员。电子邮件地址必须完全匹配。
我已经用以下数据索引了文档。在Kibana中调用GET person/_search将在结果中产生以下文档。
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "person",
        "_type": "_doc",
        "_id": "101",
        "_score": 1,
        "_source": {
          "title": """["Actor", "Hero", "Model"]""",
          "email": """["jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com", "johnny.depp@yahoo.com"]""",
          "SEARCH_ENTITY": "PERSON"
        }
      }
    ]
  }
}
现在,当我添加一些电子邮件搜索参数时,不会在结果中找回文档。记住电子邮件是关键字类型。
请求:
GET person/_search
{
  "query" : {
    "query_string" : {
      "query" : "SEARCH_ENTITY:PERSON AND (email: (johnny.depp@yahoo.com))"
    }
  }
}
响应:
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}
但是,同样的查询适用于文本类型的标题字段。
请求:
GET person/_search
{
  "query" : {
    "query_string" : {
      "query" : "SEARCH_ENTITY:PERSON AND (title: ((actor)))"
    }
  }
}
响应:
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 20.137747,
    "hits": [
      {
        "_index": "person",
        "_type": "_doc",
        "_id": "101",
        "_score": 20.137747,
        "_source": {
           "ID": "101",
           "title": """["Actor", "Hero", "Model"]""",
           "email": """["jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com", "johnny.depp@yahoo.com"]"""
         }
      }
    ]
  }
}
       
有人可以告诉我我需要做什么才能使关键字类型的电子邮件字段有效吗?
注意:如果我只存储一个电子邮件地址而不使用数组,则可以正常工作。
谢谢。

最佳答案

在为文档建立索引之前,请确保像这样解析jsont_code和title中的json数组字符串:

POST person/_doc/101
{
  "title": [
    "Actor",
    "Hero",
    "Model"
  ],
  "email": [
    "jdepp@hotmail.com",
    "johnny@hollywood.com",
    "jdepp@gmail.com",
    "johnny.depp@yahoo.com"
  ],
  "SEARCH_ENTITY": "PERSON"
}
映射无需更改-只需更改字段值即可。

关于elasticsearch - ElasticSearch:关键字数据类型字段与值数组完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64759682/

相关文章:

linux - Elasticsearch:更改旧文件夹索引的权限以使用 yum 安装的 elasticsearch

ruby-on-rails - 我们可以在运行时动态更改与Rails App上的Elasticsearch服务器的连接吗

php - 范围与elasticsearch

elasticsearch - 支持无痛语言的最小版本的kibana是什么

docker - 如何将github上的插件安装到容器上运行的Kibana

elasticsearch - 基于嵌套对象数组定义脚本字段

elasticsearch - 按值筛选汇总