Ответ 1
Просто нужно немного изменить:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path":"students",
"query": {
"bool": {
"must": [
{"match": {"name": "john"}}
]
}
}
}
},
{
"nested": {
"path":"students",
"query": {
"bool": {
"must": [
{"match": {"name": "jack"}}
]
}
}
}
}
]
}
}
}
Почему?
В принципе, во вложенном запросе запрос и фильтр совместно выполняются на одном вложенном документе - в вашем случае одно имя. Таким образом, ваш запрос будет забирать каждый вложенный документ и попытаться найти каждый документ с name
равным john
и jack
в то же время - это невозможно.
Мой запрос пытается найти индексированный документ с одним вложенным документом с name
равным john
и другим вложенным документом с name
равным jack
. Таким образом, в основном один вложенный запрос пытается полностью сопоставить один вложенный документ.
Чтобы доказать, что я предлагаю, попробуйте следующее:
Создайте тот же индекс с тем же отображением, что и вы
** Затем проиндексируйте следующие документы **
curl -XPUT 'http://localhost:9200/testing_nested_query/class/1' -d '{
"title": "class1",
"students": [{"name": "john", "age": 4},{"name": "jack", "age": 1},{"name": "jim", "age": 9}]
}'
curl -XPUT 'http://localhost:9200/testing_nested_query/class/2' -d '{
"title": "class1",
"students": [{"name": "john", "age": 5},{"name": "jack", "age": 4},{"name": "jim", "age": 9}]
}'
Теперь выполните следующие запросы:
{
"query": {
"nested": {
"path":"students",
"query": {
"bool": {
"must": [
{"match": {"name": "john"}},
{"match": {"age": 4}}
]
}
}
}
}
}
Согласно вашим ожиданиям, это должно соответствовать 2 документам, но на самом деле оно соответствует только одному. Поскольку существует только один вложенный документ, который имеет как name
, равный john
, так и age
, равный 4
.
Надеюсь, что это поможет.