Вложенные запросы в Elastic search, которые должны применяться ко всем объектам во вложенном массиве
Привет у меня есть этот документ в ES с вложенным типом:
{
"id": "92210f7f-b8a4-4d55-877d-8708154aa004",
"additionalData": {
"devices_nested": [
{
"version_string": "1"
},
{
"os_string": "Windows",
"version_string": "3"
},
{
"os_string": "Centos"
}
]
}
Я хочу сделать запрос о том, что AdditionalData.devices_nested не содержит никакого элемента, где свойство os_string не существует, что означает, что я хочу избегать таких документов, где некоторые записи могут иметь или не иметь свойство os_string. Вот мой запрос:
{
"query": {
"nested": {
"query": {
"bool": {
"must": {
"exists": {
"field": "additionalData.devices_nested.os_string"
}
}
}
},
"path": "additionalData.devices_nested"
}
}
}
Но я всегда получаю пример документа как результат, потому что по крайней мере один элемент удовлетворяет запросу, что есть свойство os_string. Можно ли сделать запрос, который будет возвращать документ, где все элементы в devices_nested имеют свойство os_string?
1 ответ
Можно ли сделать запрос, который будет возвращать документ, где все элементы в devices_nested имеют свойство os_string?
Да, это возможно. Вместо того, чтобы существовать, вы должны использовать обязательный подход.
В следующем запросе условие bool внутри nested
будет соответствовать всем документам, которые не имеют os_string
поле хотя бы в одном из вложенных объектов, а затем must_not
запрос исключит эти документы. В результате вы получите только документы, которые включают os_string
поле во всех вложенных объектах:
{
"query": {
"bool": {
"must_not": {
"nested": {
"query": {
"bool": {
"must_not": {
"exists": {
"field": "additionalData.devices_nested.os_string"
}
}
}
},
"path": "additionalData.devices_nested"
}
}
}
}
}