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