Запрос документов, которые не содержат данный объект во вложенном массиве - PullRequest
0 голосов
/ 14 апреля 2020

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

{ "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"}]}

, где поля представляют собой вложенный тип данных.

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

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

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

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

1 Ответ

1 голос
/ 15 апреля 2020

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

GET <index>/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "term": {
                "fields.id": 101
              }
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...