Elasticsearch - must(QueryBuilders.rangeQuery) 和 mustNot(QueryBuilders.existsQuery) 不能同时工作

Elasticsearch - must(QueryBuilders.rangeQuery) and mustNot(QueryBuilders.existsQuery) not working at a time

我正在使用高级 java rest client(6.5),我需要根据某个日期范围过滤数据 - 假设,我在同一个索引中有这 4 个文档(添加了邮递员图像)并且在 2 个文档中,我没有 publish_date 和 publish_end_date 字段,所以当我放置一个范围时,我需要这些范围之间的文档和没有这些范围字段的文档.

Json Values

我从这个问题中得到了一些帮助- as the QueryBuilders.missingQuery is deprecated so I am using mustNot(QueryBuilders.existsQuery) by taking the reference from here 但它不起作用,我没有得到结果。

当我只使用如下所示的范围查询时,它的工作正常-

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结果 2 中的所有值 结果 3(那是我的要求)。

您的查询出了点问题,这就是您没有得到任何结果的原因。

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

这意味着应用程序将在存储库中搜索以查找不包含 "publish_date" 的结果,但同时 "publish_date" 为 lte("now")。同样,另一个查询也有同样的问题。

无法合并您用于 result1 和 result2 的查询。

此查询的集合为空,这就是您得不到结果的原因!

编辑: 您应该使用 "should",这意味着在 elasticsearch 中 "OR"。

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

这是你应该做的:

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