# Spring Boot 与 Elasticsearch 整合指南
## 一、技术背景介绍
Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,具有以下核心特性:
1. 分布式架构支持水平扩展
2. 实时搜索能力(<1秒延迟)
3. RESTful API 接口
4. 自动数据分片与故障转移
5. 多租户支持
Spring Boot 作为主流的 Java 开发框架,提供了以下整合优势:
– 自动配置支持
– 起步依赖管理
– 健康检查集成
– 简化的REST开发模式
## 二、环境准备
### 1. 版本兼容性要求
| 组件 | 推荐版本 |
|—————-|——————-|
| Spring Boot | 2.7.x / 3.0.x |
| Elasticsearch | 7.17.x / 8.x |
| JDK | 17 |
| Maven | 3.8.x |
### 2. 依赖配置 (pom.xml)
“`xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.7.0</version>
</dependency>
“`
## 三、核心配置
### 1. application.yml 配置
“`yaml
spring:
elasticsearch:
uris:
– http://localhost:9200
username: elastic
password: your_password
connection-timeout: 5s
socket-timeout: 10s
“`
### 2. 客户端配置类
“`java
@Configuration
public class ElasticsearchConfig {
@Bean
public ElasticsearchClient elasticsearchClient() {
return new ElasticsearchClient(
RestClient.builder(
HttpHost.create(“http://localhost:9200”)
).build()
);
}
}
“`
## 四、实体映射设计
### 注解说明:
“`java
@Document(indexName = “products”, createIndex = true)
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = “ik_max_word”)
private String name;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Double)
private Double price;
// Getters and Setters
}
“`
## 五、数据访问层实现
“`java
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
List<Product> findByNameContaining(String text);
@Query(“{\”match\”: {\”category\”: \”?0\”}}”)
List<Product> searchByCategory(String category);
}
“`
## 六、服务层实现示例
“`java
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Iterable<Product> searchProducts(String query) {
return productRepository.search(query).toList();
}
public void bulkImport(List<Product> products) {
productRepository.saveAll(products);
}
}
“`
## 七、高级功能实现
### 1. 聚合查询
“`java
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation = AggregationBuilders.terms(“by_category”).field(“category.keyword”);
sourceBuilder.aggregation(aggregation);
SearchRequest request = new SearchRequest(“products”);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
Terms byCategory = response.getAggregations().get(“by_category”);
“`
### 2. 高亮显示
“`java
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags(“<strong>”).postTags(“</strong>”);
highlightBuilder.field(“name”);
SearchRequest request = new SearchRequest(“products”);
request.source().highlighter(highlightBuilder);
“`
## 八、性能优化策略
1. 批量操作优化
– 使用 BulkProcessor 进行批量索引
– 控制批处理大小(建议5MB~15MB)
2. 连接池配置
“`java
builder.setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder
.setSocketTimeout(60000)
.setConnectTimeout(5000)
);
“`
3. 索引设置优化
“`json
{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 2,
“refresh_interval”: “30s”
}
}
“`
## 九、监控与维护
1. 集成 Actuator 监控
“`
GET /actuator/health/elasticsearch
“`
2. 索引生命周期管理
– 创建 ILM 策略控制索引生命周期
– 设置热温冷数据分层存储
3. 安全配置
“`yaml
spring:
elasticsearch:
ssl:
use-system-trust-store: true
cloud-id: your-cloud-id
“`
## 十、最佳实践总结
1. 数据建模原则
– 避免嵌套对象过多
– 合理使用 keyword 和 text 类型
– 控制字段数量不超过 100
2. 查询优化技巧
– 使用 filter 替代 query 上下文
– 避免深度分页(建议使用 search_after)
– 启用请求超时控制
3. 生产环境部署建议
– 最小化安装包(移除 demo 插件)
– 启用审计日志记录
– 配置定期快照备份