Elasticsearch запрашивает вложенную структуру

Я пытаюсь запросить документы с вложенными объектами:

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

Я хочу получить все города на основе действия, например, я хочу получить все города, в которых Адам хочет пойти на фестивали. Результатом запроса должны быть Калифорния и Майами, и если мы ищем город, в котором Адам будет путешествовать, результатом запроса должна быть Калифорния.

Это то, что ДОЛЖНО быть, но фактический результат таков, что когда я ищу города, где Адам будет путешествовать, результатом запроса будут Калифорния и Майами!!

Это запрос, который я использовал:

      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"
        }
      ]
    }

Как правильно составить запрос для такой структуры данных?

Поможет ли вложенное поле?

Должен ли я перепроектировать структуру данных?

1 ответ

Вы должны сделать citiesмассив и отправить nestedзапрос для фильтрации cities.activities.name. И чтобы получить поддокумент, соответствующий вашему запросу, вы должны использоватьпотому что elasticsearch по умолчанию возвращает весь документ, а документы, не соответствующие вашему фильтру, будут продолжать возвращаться в результате.

Это пример запроса, и вы должны проверить inner_hitsв результате:

      {
  "_source": ["cities.name"], 
  "query": {
    "nested": {
      "path": "cities",
      "query": {
        "term": {
          "cities.activities.name.keyword": {
            "value": "Hicking"
          }
        }
      },
      "inner_hits": {
        "_source": ["cities.name"]
      }
    }
  }
}
Другие вопросы по тегам