Предположим, у меня есть два документа, структурированных следующим образом (предположим, есть еще много похожих):
doc1
{
"person_name": "foo",
"food_likes": [
{ "name": "steak",
"food_type": "meat",
"extra_field": "field"
},
{ "name": "chocolate cake",
"food_type": "dairy",
"extra_field": "field"
}
]
}
doc2
{
"person_name": "bar",
"food_likes": [
{ "name": "carrots",
"food_type": "vegetable"
"extra_field": "field"
},
{ "name": "chocolate cake",
"food_type": "dairy",
"extra_field": "field"
}
]
}
Я хотел бы сделать запрос, который привел бы к следующим двум вложенным документам (игнорируя fields
и inner_hits
и т. Д.):
hits: [{ "person_name": "foo",
"food_likes": [ {
"name" : "steak",
"food_type": "meat"}
]
},
{ "person_name": "bar",
"food_likes": [ {
"name" : "chocolate cake",
"food_type": "dairy"}
]
}]
, в котором один вложенный документ был возвращен из каждого документа (из документа 1 я выбрал вложенный объект с name="steak"
и вернул только поля name
и food_type
. Во втором документе я выбрал вложенный объект объект с name="chocolate cake"
и возвращает только поля name
и food_type
.
Я пришел к следующему запросу:
{
"fields": ["person_name"],
"query":{
"bool": {
"filter":[
{"terms": {
"person_name": ["foo","bar"]
}},
{"nested": {
"path":"food_likes",
"inner_hits": {
"_source":[
"name",
"food_type"
]
},
"query":{
"bool":{
"filter": [
{"terms":{
"food_likes.name":["steak", "chocolate cake"]
}}
]
}
}
}}
]
}
}
}
Тем не менее, здесь выполняется «декартово произведение», равное ["foo", "bar"]
и ["steak", "chocolate cake"]
. Таким образом, вложенный объект name="chocolate cake"
также будет возвращен с объектом name="steak"
в документе 1. Однако я хочу, чтобы steak
извлекался из foo
, а chocolate cake
- из bar
.
Возможно ли это в Elastic Search без выполнения нескольких запросов для каждого документа и без изменения структуры документа? Я посмотрел на has_parent
, но здесь это, похоже, неприменимо.