Elasticsearch 8.x Java Fluent API参数传递与兼容问题求助
Elasticsearch Java API 7.9.3 升级到8.5.3 兼容问题解决方案
1. 非空判断在Fluent API中的实现
Fluent API支持在构建过程中通过条件判断动态添加查询子句,直接复刻旧代码的非空校验逻辑即可:
BoolQuery.Builder boolQueryBuilder = BoolQuery.builder(); // 品牌ID非空校验 if (StringUtils.isNotEmpty(searchDTO.getBrandId())) { String[] brands = searchDTO.getBrandId().split("\\*"); // 注意转义正则元字符* List<FieldValue> fieldValues = Arrays.stream(brands) .map(FieldValue::of) .collect(Collectors.toList()); boolQueryBuilder.must(m -> m.terms(ts -> ts.field(ATTR_BRAND_ID).value(fieldValues))); } // 推荐字段非空校验 if (Objects.nonNull(searchDTO.getRecommend())) { boolQueryBuilder.filter(f -> f.term(t -> t.field("recommend").value(searchDTO.getRecommend()))); } // 生成最终查询条件 BoolQuery boolQuery = boolQueryBuilder.build();
说明:
- 先初始化
BoolQuery.Builder,通过外部条件判断决定是否添加对应子句,逻辑和旧代码完全一致 - 注意原代码中
split("*")存在正则语法错误,需转义为split("\\*"),否则会抛出正则表达式解析异常
2. 嵌套should查询的Fluent API实现
旧代码逻辑是对每个entry,先添加匹配属性名的嵌套查询,再添加包含多个属性值匹配的should查询(作为must子句)。Fluent API中需构建对应的嵌套BoolQuery来实现:
BoolQuery.Builder boolQueryBuilder = BoolQuery.builder(); Map<String, List<String>> valueMap = getValueMap(searchDTO); for (Map.Entry<String, List<String>> entry : valueMap.entrySet()) { // 添加匹配属性名的嵌套must查询 boolQueryBuilder.must(m -> m.nested(n -> n.path(ATTR_PATH) .query(q -> q.match(mq -> mq.field(ATTR_NAME).query(entry.getKey()))) .scoreMode(ScoreMode.None))); // 构建包含多个属性值匹配的should查询 BoolQuery.Builder shouldBoolBuilder = BoolQuery.builder(); for (String s : entry.getValue()) { shouldBoolBuilder.should(sb -> sb.nested(n -> n.path(ATTR_PATH) .query(q -> q.match(mq -> mq.field(ATTR_VALUE).query(s))) .scoreMode(ScoreMode.None))); } // 将should查询作为must子句添加到主查询 boolQueryBuilder.must(m -> m.bool(b -> b.value(shouldBoolBuilder.build()))); } // 生成最终查询条件 BoolQuery boolQuery = boolQueryBuilder.build();
说明:
- 每个entry循环中,先添加属性名匹配的嵌套查询
- 单独创建
BoolQuery.Builder来构建should逻辑,将所有属性值的嵌套查询添加为should子句 - 最后把这个should查询作为must子句加入主查询,和旧代码的逻辑完全对齐
- 保留
scoreMode(ScoreMode.None)参数,和旧代码的ScoreMode.None对应
内容的提问来源于stack exchange,提问作者IvanNie
相关产品推荐
相关产品推荐

