Elasticsearch查询嵌套结构

Elasticsearch Querying Nested Structure

我尝试查询具有嵌套对象的文档:

{
  "name":"Adam",
  "cities":[
     {
        "name":"California",
        "activities":[
           {
              "name":"Hicking"
           },
           {
              "name":"Camping"
           },
           {
              "name":"Festival"
           }
        ]
     },
     {
        "name":"Miami",
        "activities":[
           {
              "name":"Festival"
           },
           {
              "name":"Diving"
           },
           {
              "name":"Surfing"
           }
        ]
     }
  ]
}

我想根据activity检索所有城市,例如,我想检索Adam想去节日的所有城市。查询结果应该是California和Miami,如果我们搜索Adam会去哪个town hicking,查询结果应该是California。

这是应该的,但实际结果是,当我搜索 Adam 将进行 hicking 的城市时,查询结果是加利福尼亚和迈阿密!!

这是我使用的查询:

GET index/_search
{
  "query": 
        {
         "bool": {"filter": [
                    {"term": {
                         "cities.activities.name.keyword": "Hicking"
                             }}
                           ]}
                },"_source":["cities.name"]
      }

这是搜索结果:

    "_index" : "index",
    "_type" : "prod",
    "_id" : "1",
    "_score" : 0.0,
    "_source" : {
      "cities" : [
        {
          "name" : "California"
        },
        {
          "name" : "Miami"
        }
      ]
    }

对于这样的数据结构,如何进行正确的查询?

嵌套字段有帮助吗?

我应该重新设计数据结构吗?

您应该创建 cities 数组 nested 并发送 nested 查询以过滤 cities.activities.name。要获得与您的查询匹配的子文档,您应该使用 inner_hits,因为默认情况下 elasticsearch return 的整个文档和与您的过滤器不匹配的文档将在结果中继续 return。

这是一个示例查询,您应该检查结果中的 inner_hits

{
  "_source": ["cities.name"], 
  "query": {
    "nested": {
      "path": "cities",
      "query": {
        "term": {
          "cities.activities.name.keyword": {
            "value": "Hicking"
          }
        }
      },
      "inner_hits": {
        "_source": ["cities.name"]
      }
    }
  }
}