Java ElasticSearch API多字段匹配指定值或ALL查询代码不生效求解
ElasticSearch多字段查询代码修复方案
原有代码问题
- 重复定义
booleanQuery变量:同一作用域内两次声明同名final类型变量,直接导致编译失败 - 语法错误:
termsQuery方法调用缺少右括号,编译无法通过 - 查询逻辑不符合需求:将所有字段的匹配规则都放在同一个
should从句中,会导致只要任意一个字段匹配就返回结果,不符合「每个字段都需要匹配对应值或"ALL"」的要求 - 执行时序不合理:未构造完查询规则就提前将空query放入
SearchRequest,逻辑不严谨
修正后代码
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.util.Map; // 以下为业务逻辑代码 SearchRequest searchRequest = new SearchRequest(MY_INDEX); // 外层bool查询,所有字段条件都必须满足,使用must包裹 final BoolQueryBuilder outerBoolQuery = QueryBuilders.boolQuery(); for (Map.Entry<String, String> entry : params.entrySet()) { // 单个字段的匹配规则:满足指定值或者ALL即可 BoolQueryBuilder fieldMatchQuery = QueryBuilders.boolQuery(); fieldMatchQuery.should(QueryBuilders.termsQuery(entry.getKey(), entry.getValue(), "ALL")); // 单个字段规则加入外层必须满足的条件 outerBoolQuery.must(fieldMatchQuery); } // 构造完完整查询后再放入SearchRequest searchRequest.source(new SearchSourceBuilder().query(outerBoolQuery));
适配说明
- 若实际需求是任意一个字段匹配对应值/ALL就返回结果,不需要所有字段都满足,可将外层的
must改为should,同时添加outerBoolQuery.minimumShouldMatch(1)配置即可 - 上述写法完全兼容JDK 11 + ElasticSearch 7.1版本,无需调整依赖
- 若查询字段为text类型,需确保字段配置了keyword子字段,或替换为
matchQuery使用,避免分词导致匹配失败
内容的提问来源于stack exchange,提问作者Lina
相关产品推荐
相关产品推荐

