Вложенные запросы в 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"
            }
        }
    }
  }
}
Другие вопросы по тегам