Elasticsearch嵌套查询转Java API实现求助(含MUST&SHOULD)
Elasticsearch 嵌套MUST/SHOULD查询的Java API实现
以下是你提供的DSL查询对应的Java High Level REST Client实现代码:
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MatchQueryBuilder; import org.elasticsearch.index.query.MultiMatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; public class EsSearchExample { public void executeCitySearch(RestHighLevelClient esClient) throws IOException { // 构建第一个SHOULD分支的两个多字段匹配查询 MultiMatchQueryBuilder boolPrefixQuery = QueryBuilders.multiMatchQuery( "city hed", "cityName", "countryCodeName", "iso" ).type(MultiMatchQueryBuilder.Type.BOOL_PREFIX); MultiMatchQueryBuilder fuzzyCityQuery = QueryBuilders.multiMatchQuery( "city hed", "cityName*" ).fuzziness("AUTO"); // 第一个MUST条件:包含上述两个SHOULD的Bool查询 BoolQueryBuilder firstMustCondition = QueryBuilders.boolQuery() .should(boolPrefixQuery) .should(fuzzyCityQuery); // 构建第二个SHOULD分支的空ISO匹配查询(两个条件完全相同,可合并) MatchQueryBuilder emptyIsoQuery = QueryBuilders.matchQuery("iso", ""); // 第二个MUST条件:包含空ISO匹配的Bool查询 BoolQueryBuilder secondMustCondition = QueryBuilders.boolQuery() .should(emptyIsoQuery) .should(emptyIsoQuery); // 保留原DSL的重复条件,实际可只写一次 // 最外层Bool查询,组合两个MUST条件 BoolQueryBuilder outerQuery = QueryBuilders.boolQuery() .must(firstMustCondition) .must(secondMustCondition); // 构建搜索请求,设置返回数量和查询 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder() .query(outerQuery) .size(12); SearchRequest searchRequest = new SearchRequest("list") .source(sourceBuilder); // 执行查询并获取响应 SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT); // 这里可以添加结果解析逻辑,比如遍历命中的文档 // SearchHits hits = searchResponse.getHits(); // for (SearchHit hit : hits) { // String sourceAsString = hit.getSourceAsString(); // // 处理文档内容 // } } }
关键说明:
- 嵌套结构映射:DSL中的多层
bool查询完全通过BoolQueryBuilder的嵌套调用实现,must()和should()方法支持多次调用添加子查询。 - MultiMatch参数配置:
bool_prefix类型通过type()方法指定,模糊匹配的fuzziness直接设置为"AUTO",和DSL保持一致。 - 冗余处理:原DSL中第二个
should组的两个空ISO匹配条件完全重复,代码中保留了原逻辑,但实际使用时可以只添加一次,效果相同。 - 依赖提示:确保你的项目中引入了Elasticsearch High Level REST Client的依赖(版本需和你的ES集群版本一致)。
内容的提问来源于stack exchange,提问作者Guest
相关产品推荐
相关产品推荐

