我使用的是高级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"));
当我仅使用如下所示的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"));
我想要结果3 中的所有结果1 和结果2 值(这是我的要求)。
最佳答案
这是您应该做的:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.should(QueryBuilders.rangeQuery("publish_date").lte("now"))
.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("publish_date")));