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")));
我正在使用高级 java rest client(6.5),我需要根据某个日期范围过滤数据 - 假设,我在同一个索引中有这 4 个文档(添加了邮递员图像)并且在 2 个文档中,我没有 publish_date 和 publish_end_date 字段,所以当我放置一个范围时,我需要这些范围之间的文档和没有这些范围字段的文档.
Json Values
我从这个问题中得到了一些帮助-
当我只使用如下所示的范围查询时,它的工作正常-
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")));