Spring Boot 整合 Elasticsearch 技术指南

Elasticsearch 是一个开源的分布式搜索和分析引擎,常用于全文检索、日志分析等场景。Spring Boot 提供了对 Elasticsearch 的便捷支持,通过 Spring Data Elasticsearch 模块可以快速实现集成。以下是详细的技术实现步骤。


添加依赖

pom.xml 中引入 Spring Data Elasticsearch 和 Elasticsearch 客户端依赖:

<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.15.2</version>
</dependency>

配置 Elasticsearch 连接

application.propertiesapplication.yml 中配置 Elasticsearch 服务器地址:

spring.elasticsearch.rest.uris=http://localhost:9200

如果需要自定义客户端配置,可以通过 @Configuration 类实现:

@Configuration
public class ElasticsearchConfig {

    @Bean
    public RestHighLevelClient elasticsearchClient() {
        return new RestHighLevelClient(
            RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
    }
}

定义实体类

使用 @Document 注解标记 Elasticsearch 的索引和映射:

@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 and Setters
}

创建 Repository 接口

通过继承 ElasticsearchRepository 实现基础 CRUD 操作:

public interface ProductRepository extends ElasticsearchRepository<Product, String> {
    List<Product> findByName(String name);
    List<Product> findByPriceBetween(double min, double max);
}

使用 Elasticsearch 客户端

如果需要对 Elasticsearch 进行复杂操作,可以直接注入 RestHighLevelClient

@Autowired
private RestHighLevelClient client;

public void indexDocument(String index, String id, Map<String, Object> data) throws IOException {
    IndexRequest request = new IndexRequest(index)
        .id(id)
        .source(data);
    client.index(request, RequestOptions.DEFAULT);
}

实现索引与搜索功能

以下是一个简单的服务层示例,包含索引创建和搜索逻辑:

@Service
public class ProductService {

    @Autowired
    private ProductRepository repository;

    public void saveProduct(Product product) {
        repository.save(product);
    }

    public List<Product> searchByName(String name) {
        return repository.findByName(name);
    }
}

测试 Elasticsearch 功能

编写测试用例验证功能,使用 @SpringBootTest 加载上下文:

@SpringBootTest
public class ProductServiceTest {

    @Autowired
    private ProductService service;

    @Test
    public void testSaveAndSearch() {
        Product product = new Product();
        product.setName("Laptop");
        product.setPrice(999.99);
        service.saveProduct(product);

        List<Product> results = service.searchByName("Laptop");
        assertFalse(results.isEmpty());
    }
}

常见问题与优化

  • 性能优化:通过批量操作(BulkRequest)减少网络开销。
  • 索引管理:定期清理旧索引或使用别名实现零停机切换。
  • 查询优化:使用 boolQuery 组合多条件查询,避免全表扫描。

通过以上步骤,可以快速实现 Spring Boot 与 Elasticsearch 的集成,并构建高效的搜索服务。

更多推荐