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 的操作,只需要注入即可使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。