Spring Boot 2.5实战Elasticsearch全攻略,CrewAI + Bright Data MCP 打造“点评情报智能体”:从抓取到洞察。
·
Spring Boot 2.5集成Elasticsearch实践指南
环境准备
- JDK 1.8或更高版本
- Spring Boot 2.5.x
- Elasticsearch 7.x(建议7.9+)
- Maven/Gradle构建工具
添加依赖 Maven配置需包含以下核心依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.3</version>
</dependency>
配置连接参数 application.yml配置示例:
spring:
elasticsearch:
rest:
uris: http://localhost:9200
username: elastic
password: yourpassword
connection-timeout: 5s
read-timeout: 30s
实体类映射 使用@Document注解定义索引映射:
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Double)
private Double price;
// getters/setters
}
Repository接口 继承ElasticsearchRepository:
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
List<Product> findByName(String name);
Page<Product> findByPriceBetween(Double price1, Double price2, Pageable pageable);
}
自定义查询实现 通过RestHighLevelClient实现复杂查询:
@Autowired
private RestHighLevelClient client;
public List<Product> searchByCustomQuery(String keyword) {
SearchRequest searchRequest = new SearchRequest("products");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.multiMatchQuery(keyword, "name", "description"));
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理返回结果
}
性能优化建议
- 启用连接池:配置spring.elasticsearch.rest.max-conn-total
- 使用批量操作:BulkProcessor处理批量索引
- 合理设置分片数:根据数据量设置index.number_of_shards
- 启用慢查询日志:通过index.search.slowlog.threshold.query.warn配置
常见问题解决
- 版本兼容性问题:确保Spring Data Elasticsearch版本与ES服务端匹配
- 字段类型冲突:通过@Field显式指定字段类型
- 连接超时:调整connection-timeout和read-timeout参数
- 认证失败:检查用户名密码和xpack.security.enabled配置
测试验证 编写测试用例验证功能:
@SpringBootTest
class ProductSearchTest {
@Autowired
private ProductRepository repository;
@Test
void testBasicCRUD() {
Product product = new Product();
product.setName("Test Product");
product.setPrice(99.99);
Product saved = repository.save(product);
assertNotNull(saved.getId());
Optional<Product> found = repository.findById(saved.getId());
assertTrue(found.isPresent());
}
}
生产环境建议
- 使用HTTPS协议保障通信安全
- 配置集群节点而非单节点连接
- 实现健康检查机制监控ES状态
- 考虑使用Alias管理索引生命周期
- 定期备份索引快照
更多推荐
所有评论(0)