1. 概述
前面学习了 Elasticsearch 的简单基本操作,例如安装,基本的操作命令等,今天就来看看 es 和 Spring boot 的简单整合,实现增删改查的功能。众所周知,Spring boot 支持多种 NoSql 数据库,例如 redis、mongodb,elasticsearch 也是其中的一种。并且实现了 Spring boot 一贯的自动化配置,使用起来也是十分方便的。
2. 新建项目
新建一个 spring boot 项目,在 NoSql 这一栏选中 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 的操作,只需要注入即可使用。