Spring boot 整合 Elasticsearch

1. 概述

前面学习了 Elasticsearch 的简单基本操作,例如安装,基本的操作命令等,今天就来看看 es 和 Spring boot 的简单整合,实现增删改查的功能。众所周知,Spring boot 支持多种 NoSql 数据库,例如 redis、mongodb,elasticsearch 也是其中的一种。并且实现了 Spring boot 一贯的自动化配置,使用起来也是十分方便的。

2. 新建项目

新建一个 spring boot 项目,在 NoSql 这一栏选中 Elasticsearch 。

Spring boot 整合 Elasticsearch
然后在配置文件中加上 es 的配置:

spring:
  data:
    elasticsearch:
      cluster-nodes: 192.168.66.135:9300
      repositories:
        enabled: true
      cluster-name: elasticsearch

注意这里使用的是集群的 9300 端口,而不是 es 默认的 9200 端口。cluster-name 默认就是 elasticsearch,不写也可以的。

3. 简单操作

项目建好之后,可以来试试简单的操作。只要你使用过 Spring Data Jpa,那么理解起来就非常的容易了,因为用法都是类似的。

1.首先需要新建一个实体类,表示这种实体类的数据,做为 es 的文档存放。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

@Document(indexName = "product", type = "computer")
public class Product {

    private String id;

    private String name;

    private double price;

    private String brand;

    private String color;

}

@Document 注解上面可以指定 index 以及 type 的名称。

2.然后和使用 Jpa 的程序一样,新建一个 dao 层的接口,继承 ElasticsearchRepository 接口,然后可以在这个接口里面写一些自定义的方法,这里我们实现的是简单的增删改查,自带的会支持,所以就不用重写方法了。

/**
 * @author RoseDuan
 */
public interface ProductRepository extends ElasticsearchRepository<Product, String> {


}

按照逻辑还需要写 service 层,这里为了简单,我们就直接在 dao 层进行测试了。

其中修改和增加的操作类似,只需要把实体类的数据变动一下再存储就行了,只是 id 不变,否则就会新建一条记录。

需要重点关注一下查询的操作,因为 es 支持高效的搜索,所以可以直接利用这个接口实现搜索操作,并且可以分页,排序等。

全部的测试代码如下:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ProductRepositoryTest {

    @Autowired
    private ProductRepository productRepository;

    /**
     * 增加和修改操作
     */
    @Test
    public void testAdd(){
        Product product = Product.builder()
                .id("JX1125630000").name("我的笔记本电脑")
                .price(5996).brand("Mac").color("银色")
                .build();
        productRepository.save(product);
    }
    
    /**
     * 查询操作
     */
    @Test
    public void testDelete(){
        productRepository.deleteById("JX1125630000");
    }

    /**
     * 搜索操作
     */
    @Test
    public void testSearch() {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices("product").withTypes("computer")
                .withQuery(QueryBuilders.matchQuery("brand", "惠"))
                .withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC))
                .build();

        Page<Product> result = productRepository.search(searchQuery);
        List<Product> content = result.getContent();
        
        for (Product product : content){
            System.out.println(product.toString());
        }
    }
}

除了使用 Jpa 的接口,还可以 ElasticsearchTemplate 来实现对 es 的操作,只需要注入即可使用。

相关推荐