我使用的是高级Java Rest Client(6.5),我需要根据某个日期范围过滤数据-让我在同一索引中拥有这4个文档(添加了邮递员图像),而在2个文档中我没有publish_date和publish_end_date字段,因此当我放置范围时,我需要介于这些范围和不具有这些范围字段之间的文档。

Json Values

我从这个问题中得到了一些帮助-
不推荐使用ElasticSearch (2.2) Java filter between startDate and endDate if exists作为 QueryBuilders.missingQuery ,因此我通过从here获取引用来使用 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"));

spring-boot - Elasticsearch-must(QueryBuilders.rangeQuery)和mustNot(QueryBuilders.existsQuery)一次不起作用-LMLPHP

当我仅使用如下所示的mustNot查询时,我得到了所需的结果-

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

spring-boot - Elasticsearch-must(QueryBuilders.rangeQuery)和mustNot(QueryBuilders.existsQuery)一次不起作用-LMLPHP

但是问题是当我像下面这样组合两个查询时,我没有得到任何结果(获取一个空数组)-

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

spring-boot - Elasticsearch-must(QueryBuilders.rangeQuery)和mustNot(QueryBuilders.existsQuery)一次不起作用-LMLPHP

我想要结果3 中的所有结果1 结果2 值(这是我的要求)。

最佳答案

这是您应该做的:

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

10-08 18:21