Elasticsearch 6.1.2 BoolQueryBuilder构建复合查询求助
Elasticsearch 6.1.2 BoolQueryBuilder 实现需求查询
没问题,针对你要实现的查询逻辑——从students索引中获取满足(name = "XXX" 且 rollno = 1) 或者 (name = "YYY" 且 rollno = 2)的文档,我们可以通过嵌套BoolQueryBuilder来实现:外层用should处理"或"逻辑,每个"或"分支内部用must处理"且"逻辑。
完整代码示例
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; public class StudentQueryBuilder { public static BoolQueryBuilder buildStudentQuery() { // 构建第一个条件组: (name = "XXX" 且 rollno = 1) BoolQueryBuilder firstCondition = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("name", "XXX")) .must(QueryBuilders.termQuery("rollno", 1)); // 构建第二个条件组: (name = "YYY" 且 rollno = 2) BoolQueryBuilder secondCondition = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("name", "YYY")) .must(QueryBuilders.termQuery("rollno", 2)); // 外层BoolQuery,用should实现两个条件组的"或"逻辑 return QueryBuilders.boolQuery() .should(firstCondition) .should(secondCondition) .minimumShouldMatch(1); // 确保至少满足其中一个条件组 } }
代码逻辑说明
- 内部条件组:每个
BoolQueryBuilder的must方法会将多个查询条件组合成"逻辑与"的关系,只有当所有must条件都匹配时,该内部查询才会命中。 - 外层查询:外层
BoolQueryBuilder的should方法负责将两个内部查询组合成"逻辑或"的关系。设置minimumShouldMatch(1)是为了明确要求至少满足其中一个条件组(虽然在没有must/filter的情况下,Elasticsearch默认should的匹配阈值就是1,但显式设置能让逻辑更清晰)。
补充说明
- 如果你的
name字段是text类型(而非keyword),建议使用matchQuery替代termQuery,因为termQuery会精确匹配字段的原始分词结果,而matchQuery会根据字段的分词器进行匹配:QueryBuilders.matchQuery("name", "XXX") - 若要执行这个查询,你还需要构建
SearchRequest并指定students索引,示例如下:SearchRequest searchRequest = new SearchRequest("students"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(buildStudentQuery()); searchRequest.source(searchSourceBuilder);
内容的提问来源于stack exchange,提问作者Raviteja Gannoju
相关产品推荐
相关产品推荐

