Elasticsearch применяет фильтр запросов к вложенному списку, отфильтровывая несопоставленные вложенные объекты
У меня есть документ, который содержит вложенный список объектов. Я хотел бы создать запрос для возврата документов, которые содержат определенный вложенный элемент, но также ограничить приведенный список вложенных элементов теми, которые удовлетворяют условиям.
Например:
Я хочу получить все документы, которые содержат вложенный элемент "user.first": "Алиса", но также ограничить результаты, возвращаемые в "пользователи", только объектами, которые содержат в первую очередь: Алиса
PUT /posts?pretty
PUT posts
{
"mappings": {
"doc": {
"properties": {
"user": {
"type": "nested"
}
}
}
}
}
PUT posts/doc/1
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
PUT posts/doc/2
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "Black"
},
{
"first" : "Alice",
"last" : "Red"
}
]
}
Затем я могу использовать inner_hits, чтобы получить совпадающего пользователя, но я хотел бы получить этот список внутри _source.user вместо этого внутри inner_hits (не возвращайте _source.user, который не содержит Алису):
GET posts/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }}
]
}
},
"inner_hits": { }
}
}
}
возвращает это:
#hit 1:
{.....
},
#hit 2:
{
"_index": "posts",
"_type": "doc",
"_id": "2",
"_source": {
"group": "fans",
"user": [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "Black"
},
{
"first" : "Alice",
"last" : "Red"
}
]
},
"inner_hits": {
"user": {
"hits": {
"total": 2,
"hits": [
{
"_nested": {
"field": "user",
"offset": 2
},
"_source": {
"first": "Alice",
"last": "Black"
}
},
{
"_nested": {
"field": "user",
"offset": 1
},
"_source": {
"first": "Alice",
"last": "Red"
}
}
]
}
}
}