ElasticSearch Nested Query - исключить родительский документ

Попытка исключить документы верхнего уровня, если один из дочерних документов не соответствует запросу.

В приведенном ниже примере я пытаюсь исключить все документы, в которых одно из вложенных заданий имеет current: trueи совпадает с company name: Elastic, Но так как один из вложенных рабочих документов совпадает с current: false и компания name: Elastic, этот документ возвращается. Я использую вложенный запрос с обязательным совпадением по названию компании и фильтром, где current: false. Как сделать так, чтобы приведенный ниже документ не был возвращен?

 "name": "john doe",
      "jobs": [
        {
          "title": "Vice President",
          "current": true,
          "company": {
            "name": "Elastic"
          }
        },
        {
          "title": "CEO",
          "current": false,
           "company": {
             "name": "Elastic"
          }
     ...

1 ответ

Решение

Как насчет этого? Обратите внимание, что я предположил, что у вас есть .keyword подполе, которое в основном совпадает с заглавной буквой. Если у вас это по-другому, измените имя поля соответственно:

{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "jobs",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "jobs.current": {
                        "value": "true"
                      }
                    }
                  },
                  {
                    "term": {
                      "jobs.company.name.keyword": {
                        "value": "Elastic"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}