Как можно выполнять отрицательные запросы к вложенным объектам в Elasticsearch? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть индекс, документы которого содержат список вложенных объектов. Упрощенная версия сопоставлений выглядит следующим образом:

{
  "_doc": {
    "dynamic": "strict",
    "properties": {
      "things": {
        "type": "nested",
        "dynamic": "strict",
        "properties": {
          "name": {
            "type": "keyword"
          },
          "version": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

Я хочу получить все документы, которые не имеют любые вложенные вещи-объекты с определенным набором значений. Запросы типа

{
  "query": {
    "nested": {
      "path": "things",
      "query": {
        "bool": { 
          "must_not": [
            {
              "term": {
                "name": "thing1"
              }
            },
            {
              "term": {
                "version": "1.0.0"
              }
            }
          ]
        }
      }
    }
  }
}

, кажется, просто возвращает все документы, которые имеют некоторый вложенный документ, который не соответствует ... что означает, что он все еще возвращает все документы, даже те, которые также имеют , имеют вложенный документ объект, который соответствует. Итак, как мне правильно их отфильтровать?

РЕДАКТИРОВАТЬ: запросы, такие как

{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "things",
            "query": {
              "bool": { 
                "must": [
                  {
                    "term": {
                      "name": "thing1"
                    }
                  },
                  {
                    "term": {
                      "version": "1.0.0"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

, которые вложили запрос вложенного объекта в must_not, также не работают и все равно просто возвращают все.

1 Ответ

0 голосов
/ 16 апреля 2019

Ну, я в конце концов понял это сам. Оказывается, что, несмотря на явное указание поля path в запросе вложенного объекта, имена полей вложенных объектов все еще должны быть полностью квалифицированными. Таким образом, это работает:

{
  "query": {
    "nested": {
      "path": "things",
      "query": {
        "bool": { 
          "must_not": [
            {
              "term": {
                "things.name": "thing1"
              }
            },
            {
              "term": {
                "things.version": "1.0.0"
              }
            }
          ]
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...