# Spring Boot 与 Elasticsearch 整合指南

# 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 插件)
– 启用审计日志记录
– 配置定期快照备份

相关文章