粉粉蕉的笔记本粉粉蕉的笔记本
  • JAVA

    • 代码笔记
    • Java8实战
    • 分布式事务实战(Seata)
    • 模板引擎(FreeMarker)
    • SpringSecurity
  • PYTHON

    • 概述
    • python3
    • python3(菜鸟教程)
    • pandas
    • numpy
    • matplotlib
  • 中间件

    • Kafka
    • RocketMQ
    • Redis
    • MongoDB
    • Elastic Search
  • 数据库

    • Mysql
  • 设计模式
  • 运维

    • linux命令速查
    • windows命令速查
    • Docker笔记
    • kubernetes学习笔记
    • kubernetes实操笔记
    • 运维工具大全
    • git操作宝典
  • 大数据

    • 概览
    • Hadoop
    • Hive
  • 机器学习

    • 机器学习概览
  • 概率论
  • 线性代数
  • 统计学
  • 金融知识学习
  • 聚宽
  • 因子分析
  • RSS
  • 资源导航
  • 医保
  • 健身

    • 笔记
    • 训练计划
  • 装修攻略
  • 读书笔记

    • 《深度学习》
我也想搭建这样的博客!
🚋开往
  • JAVA

    • 代码笔记
    • Java8实战
    • 分布式事务实战(Seata)
    • 模板引擎(FreeMarker)
    • SpringSecurity
  • PYTHON

    • 概述
    • python3
    • python3(菜鸟教程)
    • pandas
    • numpy
    • matplotlib
  • 中间件

    • Kafka
    • RocketMQ
    • Redis
    • MongoDB
    • Elastic Search
  • 数据库

    • Mysql
  • 设计模式
  • 运维

    • linux命令速查
    • windows命令速查
    • Docker笔记
    • kubernetes学习笔记
    • kubernetes实操笔记
    • 运维工具大全
    • git操作宝典
  • 大数据

    • 概览
    • Hadoop
    • Hive
  • 机器学习

    • 机器学习概览
  • 概率论
  • 线性代数
  • 统计学
  • 金融知识学习
  • 聚宽
  • 因子分析
  • RSS
  • 资源导航
  • 医保
  • 健身

    • 笔记
    • 训练计划
  • 装修攻略
  • 读书笔记

    • 《深度学习》
我也想搭建这样的博客!
🚋开往
    • 概述
    • 原理
    • 运维&部署
    • 原生API
    • SpringBoot集成

SpringBoot集成

1. Elasticsearch Java API Client

引入依赖

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.12.0</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 需要Jackson支持 -->
</dependency>

配置文件

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;

@Configuration
public class ElasticsearchConfig {

    @Bean
    public ElasticsearchClient elasticsearchClient() {
        // 1. 创建底层 REST 客户端
        RestClient restClient = RestClient.builder(
            new HttpHost("localhost", 9200) // ES地址
        ).build();

        // 2. 使用Jackson映射器创建传输层
        ElasticsearchTransport transport = new RestClientTransport(
            restClient,
            new JacksonJsonpMapper()
        );

        // 3. 创建API客户端
        return new ElasticsearchClient(transport);
    }
}

查询示例

// 1. 查询所有学生 (match_all)
List<Student> students = client.search(s -> s
    .index("student")
    .query(q -> q.matchAll(m -> m)),
    Student.class
).hits().hits().stream()
    .map(hit -> hit.source())
    .collect(Collectors.toList());

// 2. 按ID查询 (term查询)
Student student = client.search(s -> s
    .index("student")
    .query(q -> q.term(t -> t.field("id").value(1))),
    Student.class
).hits().hits().get(0).source();

2. Spring Data Elasticsearch

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置

# application.yml
spring:
  elasticsearch:
    uris: "http://localhost:9200" # ES地址

查询示例

@Repository
public interface StudentRepository extends ElasticsearchRepository<Student, Long> {
    // 自动实现基础CRUD
}

// 复杂查询
List<Student> students = elasticsearchOperations.search(
    new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.matchAllQuery())
        .build(),
    Student.class
).getSearchHits().stream()
    .map(hit -> hit.getContent())
    .collect(Collectors.toList());

3. 旧版RestHighLevelClient

Warning

已在 Elasticsearch 7.15.0 后被标记为废弃,并在 8.0 版本中移除。

引入依赖

		<!--引入es-high-level-client相关依赖  start-->
		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>

		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>

		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-client</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>
  1. 查询所有文档 (对应 SELECT * FROM student)
@Autowired
private RestHighLevelClient client;

public List<Map<String, Object>> findAllStudents() throws IOException {
    SearchRequest searchRequest = new SearchRequest("student");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchAllQuery()); // 匹配所有文档
    
    searchRequest.source(sourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    
    return Arrays.stream(response.getHits().getHits())
            .map(SearchHit::getSourceAsMap)
            .collect(Collectors.toList());
}

  1. 精确ID查询 (对应 SELECT * FROM student WHERE id = 1)
public Map<String, Object> findStudentById(String id) throws IOException {
    SearchRequest searchRequest = new SearchRequest("student");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.termQuery("id", id)); // 精确匹配
    
    searchRequest.source(sourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    
    return response.getHits().getHits().length > 0 
            ? response.getHits().getHits()[0].getSourceAsMap() 
            : null;
}

  1. 分页查询
public List<Map<String, Object>> findStudentsWithPagination(int page, int size) throws IOException {
    SearchRequest searchRequest = new SearchRequest("student");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    
    sourceBuilder.query(QueryBuilders.matchAllQuery())
                 .from((page - 1) * size)  // 分页起始位置
                 .size(size);               // 每页大小
    
    searchRequest.source(sourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    
    return Arrays.stream(response.getHits().getHits())
            .map(SearchHit::getSourceAsMap)
            .collect(Collectors.toList());
}

  1. 带条件的复合查询
public List<Map<String, Object>> findStudentsByCondition(String name, int minAge) throws IOException {
    SearchRequest searchRequest = new SearchRequest("student");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    
    // 构建组合查询
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
            .must(QueryBuilders.matchQuery("name", name))      // 必须匹配name
            .filter(QueryBuilders.rangeQuery("age").gte(minAge)); // 过滤age>=minAge
    
    sourceBuilder.query(boolQuery);
    searchRequest.source(sourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    
    return Arrays.stream(response.getHits().getHits())
            .map(SearchHit::getSourceAsMap)
            .collect(Collectors.toList());
}

Last Updated: 7/18/25, 10:21 AM
Contributors: dongyz8
Prev
原生API