将 Elasticsearch(ES)集成到 Spring Boot 项目中,可以通过 Spring Data Elasticsearch 或 Elasticsearch 官方客户端(如 RestHighLevelClient
)实现。以下是详细步骤和示例:
1. 依赖配置
在 pom.xml
中添加 Spring Data Elasticsearch 的依赖(注意版本匹配):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>3.1.5</version> <!-- 根据 Spring Boot 版本调整 -->
</dependency>
版本兼容性:确保 Elasticsearch 服务端版本与 Spring Data Elasticsearch 版本匹配(官方文档)。
2. 配置 Elasticsearch 连接
在 application.yml
或 application.properties
中配置 ES 地址:
spring:
elasticsearch:
uris: http://localhost:9200 # ES 服务地址
username: elastic # 如果有安全认证
password: your_password
本地 ES 启动:可通过 Docker 快速启动:
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.9.0
3. 定义实体类
使用 @Document
注解标记 Elasticsearch 的索引和映射:
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@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
}
4. 创建 Repository 接口
继承 ElasticsearchRepository
实现 CRUD 操作:
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
// 自定义查询方法
List<Product> findByName(String name);
List<Product> findByPriceBetween(Double minPrice, Double maxPrice);
}
5. 使用 Repository 操作数据
在 Service 或 Controller 中注入 Repository:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public List<Product> searchByName(String name) {
return productRepository.findByName(name);
}
}
6. 自定义复杂查询
使用 @Query
注解或 NativeSearchQueryBuilder
构建复杂查询:
// 通过注解自定义 DSL 查询
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
@Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
List<Product> customSearch(String keyword);
}
// 通过 QueryBuilder 动态构建查询
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
public List<Product> searchByKeyword(String keyword) {
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("name", keyword))
.build();
SearchHits<Product> hits = elasticsearchOperations.search(query, Product.class);
return hits.stream().map(hit -> hit.getContent()).collect(Collectors.toList());
}
7. 使用 RestHighLevelClient(可选)
如果需要更底层的操作,可手动配置客户端:
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
@Configuration
public class ElasticsearchConfig {
@Bean
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration config = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.withBasicAuth("elastic", "your_password")
.build();
return RestClients.create(config).rest();
}
}
// 注入使用
@Autowired
private RestHighLevelClient client;
8. 测试集成
-
写入数据测试:
Product product = new Product(); product.setName("Laptop"); product.setPrice(999.99); productRepository.save(product);
-
查询数据验证:
List<Product> results = productRepository.findByName("Laptop");
-
检查 ES 索引:
curl http://localhost:9200/products/_search
9. 常见问题处理
-
版本不兼容:确保 Spring Data Elasticsearch 版本与 ES 服务端版本匹配。
-
连接失败:检查 ES 地址、端口、防火墙设置及安全认证。
-
映射错误:通过
@Field
注解明确字段类型,避免自动推断错误。
总结
通过 Spring Data Elasticsearch,可以快速实现 ES 的集成,简化 CRUD 和查询操作。对于复杂场景,可结合 RestHighLevelClient
或自定义查询构建器灵活扩展。