ElasticSearch的BoolQueryBuilder查询方法记录

Java项目中使用到es来查询订单项,其中有一个业务场景是需要查一个字段要么是空的要么是某个数值,原先代码如下

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termsQuery("YY.xx字段", param.getXx().toString()));
// xx状态为失败或者为空的
boolQuery.should(QueryBuilders.termQuery("YY.A字段",4));
boolQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("YY.A字段")));
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("YY",boolQuery, ScoreMode.None);
boolQueryBuilder.filter(nestedQueryBuilder);

这样写完测试发现无果,A字段的这两个条件都无法被匹配

经搜索后发现,es的should查询代替的是or,但是必须搭配must来使用,后将代码更改如下

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 用shouldQuery来记录两个or条件
BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchQuery("YY.xx字段", param.getXx()));
// xx状态为失败或者为空的
// or条件用should查询,必须配合must使用
shouldQuery.should(QueryBuilders.matchQuery("YY.A字段",4));
shouldQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("YY.A字段")));
boolQuery.must(shouldQuery);//必须搭配这个
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("YYs",boolQuery, ScoreMode.None);
boolQueryBuilder.filter(nestedQueryBuilder);
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐