如何将Elasticsearch Bool查询转换为Spring Boot Java代码?
将Elasticsearch Bool查询转换为Spring Boot Java代码
你已经在Kibana验证了查询结果,下面是对应的Spring Boot Java实现代码,基于RestHighLevelClient(Spring Boot中常用的Elasticsearch客户端):
1. 确保依赖配置
如果使用Spring Boot,在pom.xml中添加Maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
Gradle项目则添加:
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
2. Java代码实现
构建查询并执行
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.NestedQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; @Service public class FeedSearchService { private final RestHighLevelClient restHighLevelClient; @Autowired public FeedSearchService(RestHighLevelClient restHighLevelClient) { this.restHighLevelClient = restHighLevelClient; } public SearchResponse searchFeeds(String searchText) throws IOException { // 1. 构建嵌套查询:匹配comment.c_text字段,包含inner_hits MatchQueryBuilder matchCommentQuery = QueryBuilders.matchQuery("comment.c_text", searchText); NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery( "comment", matchCommentQuery, org.elasticsearch.index.query.QueryBuilders.NestedQueryBuilder.InnerHitBuilder::new ).innerHit(new org.elasticsearch.search.fetch.subphase.innerhits.InnerHitBuilder()); // 2. 构建title字段的精确匹配查询 TermQueryBuilder titleTermQuery = QueryBuilders.termQuery("title", searchText); // 3. 构建body字段的精确匹配查询 TermQueryBuilder bodyTermQuery = QueryBuilders.termQuery("body", searchText); // 4. 组装Bool查询的should条件:满足任意一个查询即可返回结果 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .should(nestedQuery) .should(titleTermQuery) .should(bodyTermQuery); // 5. 构建搜索请求,指定索引为feeds SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQuery); SearchRequest searchRequest = new SearchRequest("feeds").source(sourceBuilder); // 6. 执行查询并返回结果 return restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); } }
实体类映射示例(可选)
如果需要将查询结果直接映射为Java对象,可以定义对应的实体类:
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.Nested; import java.util.List; @Document(indexName = "feeds") public class Feed { private String id; @Field(type = FieldType.Text) private String title; @Field(type = FieldType.Text) private String body; @Nested @Field(type = FieldType.Nested) private List<Comment> comment; // Getter、Setter方法 public static class Comment { @Field(type = FieldType.Text) private String c_text; // Getter、Setter方法 } }
关键说明
NestedQueryBuilder中配置了innerHit,完全对应原查询中的"inner_hits": {}参数BoolQueryBuilder的should方法会将三个查询组合,只要文档匹配其中任意一个条件就会被返回- 若需要处理查询结果,可以使用
ElasticsearchRestTemplate将SearchResponse转换为实体类列表,或者手动解析响应数据
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

