将 Elasticsearch(ES)集成到 Spring Boot 项目

将 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. 测试集成

  1. 写入数据测试

    Product product = new Product();
    product.setName("Laptop");
    product.setPrice(999.99);
    productRepository.save(product);
     
  2. 查询数据验证

    List<Product> results = productRepository.findByName("Laptop");

  3. 检查 ES 索引

    curl http://localhost:9200/products/_search


9. 常见问题处理

  • 版本不兼容:确保 Spring Data Elasticsearch 版本与 ES 服务端版本匹配。

  • 连接失败:检查 ES 地址、端口、防火墙设置及安全认证。

  • 映射错误:通过 @Field 注解明确字段类型,避免自动推断错误。


总结

通过 Spring Data Elasticsearch,可以快速实现 ES 的集成,简化 CRUD 和查询操作。对于复杂场景,可结合 RestHighLevelClient 或自定义查询构建器灵活扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I-NullMoneyException

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值