У меня такая структура:

{ "id": "object1", "fields": [{"id": 100, "value": "one"}, {"id": 101, "value": "abc"}]}
{ "id": "object2", "fields": [{"id": 100, "value": "two"}, {"id": 101, "value": "cde"}]}
{ "id": "object3", "fields": [{"id": 100, "value": "three"}]}

Где поля - это вложенный тип данных.

С помощью вложенного запроса я могу получить все объекты, которые имеют определенное значение данного поля (например, с помощью: field.id = 101 && field.value = "abc" я могу получить object1).

Как я могу запросить объекты, массивы fields которых не включают данное поле по его идентификатору?

  • Пример1: мне нужны все объекты, у которых нет поля с идентификатором 101 - возвращает объект3
  • Пример 2: мне нужны все объекты, у которых нет поля с идентификатором 102 - возвращает объект 1, 2 и 3

Я ищу в основном запрос exists (который я затем могу отрицать), который принимает предикат.

2
lgasior 14 Апр 2020 в 23:12

1 ответ

Лучший ответ

Поскольку вы имеете дело с вложенными документами, и вы хотите, чтобы, если ни один из вложенных документов не соответствует условию, этот документ следует рассматривать как совпадение. Если я перефразирую это, я могу сказать, что не извлекайте тот документ, в котором есть вложенный документ, соответствующий условию. Переводя это в запрос dsl,

GET <index>/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "term": {
                "fields.id": 101
              }
            }
          }
        }
      ]
    }
  }
}
2
Nishant 15 Апр 2020 в 03:06