Elasticsearch 查询嵌套对象

Blu*_*eon 3 nested elasticsearch

我在弹性中有这样的记录:

{
    "FirstName": "Winona",
    "LastName": "Ryder",
    "Notes": "<p>she is an actress</p>",
    "Age": "40-50",
    "Race": "Caucasian",
    "Gender": "Female",
    "HeightApproximation": "No",
    "Armed": false,
    "AgeCategory": "Adult",
    "ContactInfo": [
        {
            "ContactPoint": "stranger@gmail.com",
            "ContactType": "Email",
            "Details": "Details of tv show",
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想在联系信息对象内部进行查询,我使用了下面的查询,但没有得到任何结果:

{
    "query": {
        "nested" : {
            "path" : "ContactInfo",
            "query" : {
                "match" : {"ContactInfo.Details" : "Details of tv show"}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

{
   "query": {
     "term" : { "ContactInfo.ContactType" : "email" } 
   }
}
Run Code Online (Sandbox Code Playgroud)

这是联系信息的映射:

"ContactInfo":{
    "type": "object"
}
Run Code Online (Sandbox Code Playgroud)

我想我知道问题是字段没有设置为嵌套在映射中,有没有办法在不更改映射的情况下仍然查询嵌套,我只是想避免重新索引数据(如果可能的话)。我对弹性搜索还很陌生,所以需要你的帮助。

提前致谢。

ESC*_*der 10

Elasticsearch 没有内部对象的概念。

Elasticsearch 官方文档中有关嵌套字段类型的一些要点

  1. 嵌套类型是对象数据类型的特殊版本,它允许以可以彼此独立查询的方式对对象数组进行索引。
  2. 如果需要对对象数组进行索引并保持数组中每个对象的独立性,请使用嵌套数据类型而不是对象数据类型。
  3. 在内部,嵌套对象将数组中的每个对象索引为单独的隐藏文档,以便可以使用嵌套查询独立于其他对象来查询每个嵌套对象。

请参阅此SO 答案,以获取更多详细信息

添加带有索引映射、搜索查询和搜索结果的工作示例

应用嵌套数据类型后,您必须重新索引数据

索引映射:

{
  "mappings": {
    "properties": {
      "ContactInfo": {
        "type": "nested"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

搜索查询:

{
    "query": {
        "nested" : {
            "path" : "ContactInfo",
            "query" : {
                "match" : {"ContactInfo.Details" : "Details of tv show"}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

搜索结果:

"hits": [
      {
        "_index": "stof_64269180",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.1507283,
        "_source": {
          "FirstName": "Winona",
          "LastName": "Ryder",
          "Notes": "<p>she is an actress</p>",
          "Age": "40-50",
          "Race": "Caucasian",
          "Gender": "Female",
          "HeightApproximation": "No",
          "Armed": false,
          "AgeCategory": "Adult",
          "ContactInfo": [
            {
              "ContactPoint": "stranger@gmail.com",
              "ContactType": "Email",
              "Details": "Details of tv show"
            }
          ]
        }
      }
    ]
Run Code Online (Sandbox Code Playgroud)