Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
<img src="//i.stack.imgur.com/RUiNP.png" height="16" width="18" alt="" class="sponsor tag img">elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Kibana_Elasticsearch 6.5 - Fatal编程技术网 elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配,elasticsearch,kibana,elasticsearch-6.5,elasticsearch,Kibana,Elasticsearch 6.5" /> elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配,elasticsearch,kibana,elasticsearch-6.5,elasticsearch,Kibana,Elasticsearch 6.5" />

elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配

elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配,elasticsearch,kibana,elasticsearch-6.5,elasticsearch,Kibana,Elasticsearch 6.5,在ElasticSearch中,我有一个电子邮件字段和标题字段的映射,如下所示: { "person": { "mappings": { "_doc": { "email": { "type": "keyword", "boost": 80 },

在ElasticSearch中,我有一个电子邮件字段和标题字段的映射,如下所示:

  {
  "person": {
    "mappings": {
      "_doc": {
         "email": {
           "type": "keyword",
           "boost": 80
          },
          "title": {
          "type": "text",
           "boost": 70
          }
       }
     }
   }
 
每个人可以有一个以上的电子邮件地址和标题。所以,我将这些值存储在数组中。 我使用query_字符串搜索具有电子邮件地址和/或标题的人员。电子邮件地址需要完全匹配

我用以下数据为一个文档编制了索引。在Kibana中调用
GET person/\u 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))"
    }
  }
}
GET person/_search
{
  "query" : {
    "query_string" : {
      "query" : "SEARCH_ENTITY:PERSON AND (title: ((actor)))"
    }
  }
}
答复:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}
{
  "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"]"""
         }
      }
    ]
  }
}
       
但对于文本类型的标题字段,也可以使用相同的查询

请求:

GET person/_search
{
  "query" : {
    "query_string" : {
      "query" : "SEARCH_ENTITY:PERSON AND (email: (johnny.depp@yahoo.com))"
    }
  }
}
GET person/_search
{
  "query" : {
    "query_string" : {
      "query" : "SEARCH_ENTITY:PERSON AND (title: ((actor)))"
    }
  }
}
答复:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}
{
  "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"]"""
         }
      }
    ]
  }
}
       
有人能告诉我,我需要做什么,使这个工作的电子邮件字段是关键字类型

注意:如果我只存储一个电子邮件地址而不使用数组,那么它可以正常工作


谢谢。

在索引文档之前,请确保在
title
email
中解析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检索文档时,我会看到如下标题和电子邮件字段:“标题”:“[“演员”、“英雄”、“模型”]”,“电子邮件”:“[”jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com“约翰尼。depp@yahoo.com"]"""这让我觉得数组值的索引是正确的,不是吗?我不明白为什么数组的开头和结尾都有3个双引号。这就是你索引它们的方式。三重引号是一种Kibana约定,可以提高可读性,因为在严格有效的JSON中,通常必须对引号进行转义,如
“[\”Actor\“…
。长话短说,您已经为本应是字符串数组的字符串编制了索引。感谢您解释了三重引号。我正在用转义双引号和数组传递值。仍然不起作用。”[\“Actor\”,“Hero\”,“Model\”]仍然不是。按照我的回答中提到的方式传递。没有前导引号…如果我按照你在示例中列出的方式传递数组,它会工作。但是我需要使用PUT API将JSON正文传递给ElasticSearch。在正文中,我将这些电子邮件作为JSONArray对象传递。在这种情况下,这不起作用。看起来ElasticSearch认为整个数组是一个字符串你知道如何将数组作为JSON传递吗?谢谢。