Elasticsearch-проблема в использовании высокого уровня Java-клиента restQuery () - PullRequest
0 голосов
/ 27 марта 2019

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

Мои требования соответствуют этому вопросу

ElasticSearch (2.2) Java-фильтр между startDate и endDate, если существует

Но QueryBuilders.missingQuery показывает неопределенный для QueryBuilders в 6.5.

The json documents

Возможно ли это?

Я изменил запрос, как показано ниже -

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

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

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

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

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

    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"));

1 Ответ

0 голосов
/ 27 марта 2019

Отсутствующий запрос используется в Elasticsearch 1 и 2. В Elasticsearch 5 он устарел.

Пожалуйста, смотрите устарела ссылка здесь

В QueryBuilders также есть опция, называемая существующим запросом, поэтому мы можем использовать ее для поиска документов, для которых не существует определенных полей, которые не должны содержать логический запрос. Здесь мы должны добавить не должен с существующим запросом искать эти поля несуществующих документов вместе с документами с диапазоном соответствия

setRangeFieldsQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("field_name")));

Пожалуйста, обратитесь Документация eixst запроса здесь

...