Запрос Elasticsearch, исключающий результаты другого запроса - PullRequest
0 голосов
/ 02 июля 2018

Упрощенный индекс Elasticsearch для «статей» содержит документы с полями domain_name и tag, а также некоторое другое содержимое.

tag ограничен несколькими значениями ключевых слов, такими как source1, source2, где tag может иметь только одно значение в каждом документе. domain_name - это одно значение в каждом документе

Я хотел бы вернуть набор документов, где tag=source1, которые не включают domain_name из другого запроса, где tag=source2

В двух шагах это будет что-то вроде:

установлен для исключения

{
  "query": {
    "term" : { "tag" : "source2" } 
  }
}

Результаты будут обработаны для получения массива domain_name значений, по одному из каждого возвращенного документа.

Затем второй запрос получит все интересующие его элементы, а затем исключит термы, которых он не имеет (список доменных имен из предыдущего запроса).

запрос минус установлен для исключения

{
  "query": {
    "bool": {
      "must": {
        "term" : { "tag" : "source1" } 
      },
      "must_not": {
        "terms": {
          "tag": [<array of domain_name values>]
        }
      }
    }
  }
}

Возможно ли это в одном запросе или с использованием агрегатов? Индексы и наборы результатов не будут большими, поэтому я меньше беспокоюсь о производительности, чем об удобстве.

Дополнительный вопрос, можно ли это определить непосредственно в Кибане?

1 Ответ

0 голосов
/ 02 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...