Elasticsearch - must (QueryBuilders.rangeQuery) и mustNot (QueryBuilders.existsQuery) не работают одновременно - PullRequest
1 голос
/ 29 марта 2019

Я использую Java-клиент высокого уровня (6.5), и мне нужно отфильтровать данные по некоторому диапазону дат - пусть у меня есть эти 4 документа (добавлено изображение почтальона) в одном индексе и в 2 документах, которые я не использую. у меня нет полей publish_date и publish_end_date, поэтому, когда я укажу диапазон, мне понадобятся документы, которые будут находиться между этим диапазоном, и документы, которые также не имеют этих полей диапазона.

Значения Json

Я получил некоторую помощь от этого вопроса ElasticSearch (2.2) Java-фильтр между startDate и endDate, если существует , поскольку QueryBuilders.missingQuery устарело, поэтому я использую mustNot (QueryBuilders.existsQuery) , взяв ссылка здесь , но она не работает, и я не получаю результаты.

когда я использую только запрос диапазона, как показано ниже его рабочего штрафа-

BoolQueryBuilder startDateQuery = new BoolQueryBuilder()
           .must(QueryBuilders.rangeQuery("publish_date").lte("now"));
BoolQueryBuilder endDateQuery = new BoolQueryBuilder()
          .must(QueryBuilders.rangeQuery("publish_end_date").gte("now"));

result 1

Когда я использую только запрос mustNot, как показано ниже, я получаю желаемые результаты -

BoolQueryBuilder startDateQuery = new BoolQueryBuilder()
           .mustNot(QueryBuilders.existsQuery("publish_date"));
BoolQueryBuilder endDateQuery = new BoolQueryBuilder()
          .mustNot(QueryBuilders.existsQuery("publish_end_date"));

result 2

Но проблема в том, что когда я объединяю оба запроса, как показано ниже, я не получаю никакого результата (получаю пустой массив) -

BoolQueryBuilder startDateQuery = new BoolQueryBuilder()
           .must(QueryBuilders.rangeQuery("publish_date").lte("now"))
           .mustNot(QueryBuilders.existsQuery("publish_date"));
BoolQueryBuilder endDateQuery = new BoolQueryBuilder()
          .must(QueryBuilders.rangeQuery("publish_end_date").gte("now"))
          .mustNot(QueryBuilders.existsQuery("publish_end_date"));

result 3

Я хочу, чтобы все результат 1 и результат 2 значений в результат 3 (это мое требование).

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Вот что вы должны сделать:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
  .should(QueryBuilders.rangeQuery("publish_date").lte("now"))
  .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("publish_date")));
1 голос
/ 29 марта 2019

Что-то идет не так с вашим запросом, и поэтому вы не получаете результатов.

BoolQueryBuilder startDateQuery = new BoolQueryBuilder()
           .must(QueryBuilders.rangeQuery("publish_date").lte("now"))
           .mustNot(QueryBuilders.existsQuery("publish_date"));

Это означает, что приложение будет искать в хранилище результаты, которые не содержат "publish_date", но нав то же время "publish_date" будет lte ("сейчас").Точно так же существует та же проблема для другого запроса.

Запросы, которые вы использовали для результатов1 и результатов2, не могут быть объединены.

Набор для этого запроса нулевой, и поэтому вы не получаетерезультаты!

РЕДАКТИРОВАТЬ: Вы должны использовать «should», что означает «ИЛИ» в эластичном поиске.

BoolQueryBuilder startDateQuery = QueryBuilders.boolQuery()
  .should(QueryBuilders.rangeQuery("publish_date").lte("now"))
  .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("publish_date")));

Аналогично для endDateQuery:

BoolQueryBuilder endDateQuery = QueryBuilders.boolQuery()
  .should(QueryBuilders.rangeQuery("publish_end_date").gte("now"))
  .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("publish__end_date")));
...