如何用Elasticsearch Java API Client构建带List<String>的TermsQuery
解决Elasticsearch Java客户端构建TermsQuery时的类型不匹配问题
你要构建的目标ES查询是:
{"query":{"bool":{"filter":{"bool":{"must_not":{"terms":{"names":["john","jose"]}}}}}}
你的代码报错是因为TermsQueryBuilder.value()方法需要接收FieldValue类型的列表,而非直接传入String列表。只需把字符串列表转换为FieldValue列表即可解决,修正后的代码如下:
BoolQuery.Builder builder = new BoolQueryBuilder(); List<String> names = Arrays.asList("john", "jose"); // 将String列表转换为FieldValue列表 List<FieldValue> fieldValues = names.stream() .map(FieldValue::of) .collect(Collectors.toList()); // 构建terms查询并添加到must_not中 builder.mustNot(TermsQuery.of(t -> t.field("names").terms(terms -> terms.value(fieldValues)))._toQuery());
简化写法(无需单独创建TermsQueryField)
其实可以直接在Lambda表达式里完成转换,更简洁:
BoolQuery.Builder builder = new BoolQueryBuilder(); List<String> names = Arrays.asList("john", "jose"); builder.mustNot(TermsQuery.of(t -> t.field("names") .terms(terms -> terms.value(names.stream().map(FieldValue::of).collect(Collectors.toList()))))._toQuery());
关键点说明
FieldValue.of(String):将普通字符串转换为ES客户端所需的FieldValue类型,适配terms查询的参数要求- 上述写法适配新版Elasticsearch Java High Level Client(8.x版本),如果是旧版本可调整为对应API的转换方式
内容的提问来源于stack exchange,提问作者Anamika
相关产品推荐
相关产品推荐

