Spring boot Elasticsearch-必须(QueryBuilders.rangeQuery)和不得(QueryBuilders.existsQuery)同时不工作
我使用的是高级java rest客户端(6.5),我需要根据某个日期范围过滤数据-让我看看,我有这4个文档(添加了一个邮递员图像)在同一个索引和两个文档中,我没有“发布日期”和“发布结束日期”字段,因此当我放置一个范围时,我需要介于这些范围和没有这些范围字段的文档之间的文档 我从这个问题中得到了一些帮助- 由于QueryBuilders.missingQuery已被弃用,因此我通过引用使用mustNot(QueryBuilders.existsQuery),但它不起作用,我得不到结果 当我只使用下面这样的范围查询时,它工作正常-Spring boot Elasticsearch-必须(QueryBuilders.rangeQuery)和不得(QueryBuilders.existsQuery)同时不工作,spring-boot,elasticsearch,elastic-stack,elasticsearch-6,Spring Boot,elasticsearch,Elastic Stack,Elasticsearch 6,我使用的是高级java rest客户端(6.5),我需要根据某个日期范围过滤数据-让我看看,我有这4个文档(添加了一个邮递员图像)在同一个索引和两个文档中,我没有“发布日期”和“发布结束日期”字段,因此当我放置一个范围时,我需要介于这些范围和没有这些范围字段的文档之间的文档 我从这个问题中得到了一些帮助- 由于QueryBuilders.missingQuery已被弃用,因此我通过引用使用mustNot(QueryBuilders.existsQuery),但它不起作用,我得不到结果 当我只使
BoolQueryBuilder startDateQuery=newboolquerybuilder()
.must(QueryBuilders.rangeQuery(“发布日期”).lte(“现在”);
BoolQueryBuilder endDateQuery=newboolquerybuilder()
.must(QueryBuilders.rangeQuery(“发布结束日期”).gte(“现在”);
当我只使用下面的mustNot查询时,我得到了期望的结果-
BoolQueryBuilder startDateQuery=newboolquerybuilder()
.mustNot(QueryBuilders.existsQuery(“发布日期”);
BoolQueryBuilder endDateQuery=newboolquerybuilder()
.mustNot(QueryBuilders.existsQuery(“发布结束日期”);
但问题是,当我像下面这样组合两个查询时,我没有得到任何结果(得到一个空数组)-
BoolQueryBuilder startDateQuery=newboolquerybuilder()
.must(QueryBuilders.rangeQuery(“发布日期”).lte(“现在”))
.mustNot(QueryBuilders.existsQuery(“发布日期”);
BoolQueryBuilder endDateQuery=newboolquerybuilder()
.must(QueryBuilders.rangeQuery(“发布\结束\日期”).gte(“现在”))
.mustNot(QueryBuilders.existsQuery(“发布结束日期”);
我需要结果3中的所有结果1和结果2值(这是我的要求)。您的查询出了问题,因此没有结果
BoolQueryBuilder startDateQuery = new BoolQueryBuilder()
.must(QueryBuilders.rangeQuery("publish_date").lte("now"))
.mustNot(QueryBuilders.existsQuery("publish_date"));
这意味着应用程序将在存储库中搜索不包含“发布日期”的结果,但同时将“发布日期”设置为lte(“现在”)。同样,另一个查询也存在同样的问题
无法组合您用于results1和results2的查询
此查询的集合为空,这就是为什么没有结果
编辑:
在elasticsearch中,应该使用“应该”,意思是“或”
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")));
那么,我怎样才能得到组合,或者根据我的要求,怎样进行查询呢?你能帮我吗?你可以使用“应该”这个类似于“或”的函数。请参阅@dadoonet答案和我的编辑!