You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:25:34