第一章 Spring Data ElasticSearch 使用
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。
4.1环境搭建
实现步骤:
-
创建SpringBoot的项目
-
勾选starter依赖坐标
-
编写持久层接口GoodDao,编写pojo实体类
public interface GoodDao { }
public class Good { private Long id;//商品的唯一标识 private String title;//标题 private String category;//分类 private String brand;//品牌 private Double price;//价格 private String images;//图片地址 //getter,setter,toString }
-
配置文件,集群配置,ElasticSearch服务地址http://127.0.0.1:9300
# 配置集群名称 spring.data.elasticsearch.cluster-name=elasticsearch # 配置es的服务地址 spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
1、创建索引库操作
几个用到的注解:
-
@Document:声明索引库配置
-
indexName:索引库名称
-
type:类型名称,默认是“docs”
-
shards:分片数量,默认5
-
replicas:副本数量,默认1
-
-
@Id:声明实体类的id
-
@Field:声明字段属性
-
type:字段的数据类型
-
analyzer:指定分词器类型
-
index:是否创建索引 默认为true
-
store:是否存储 默认为false
实体类的配置:
/** * 商品实体类 * @Document() 注解作用:定义一个索引库,一个类型 * indexName属性:指定索引库的名称 * type属性:指定类型名称 * shards属性:指定分片数 * replicas属性:指定复制副本数 */ @Document(indexName = "heima4",type = "goods",shards = 5,replicas = 1) public class Good { //必须有id,这里的id是全局唯一的标识,等同于es中的“_id” @Id private Long id; /** * type: 字段数据类型 * analyzer: 分词器类型 * index: 是否索引(默认值:true) * store: 是否存储(默认值:false) */ @Field(type = FieldType.Text,analyzer = "ik_max_word") private String title;//标题 @Field(type = FieldType.Keyword) private String category;//分类 @Field(type = FieldType.Keyword) private String brand;//品牌 @Field(type = FieldType.Double) private Double price;//价格 @Field(type = FieldType.Keyword,index = false) private String images;//图片地址 //getter ,setter ,toString }
测试类:
/** * 目标:完成创建索引,配置映射 * 1.注入ElasticSearchTemplate对象 * 2.配置Good实体类 * 3.调用创建索引的方法createIndex() * 调用配置映射的方法PutMapping() * 测试删除索引方法deleteIndex() */ @RunWith(SpringRunner.class) @SpringBootTest public class SpringdataEsIndex { //注入ElasticSearchTemplate模板对象 @Autowired private ElasticsearchTemplate elasticsearchTemplate; //创建索引,配置映射 @Test public void createIndexAndPutMapping() { //创建索引 boolean indexResult = elasticsearchTemplate.createIndex(Good.class); System.out.println("创建索引结果:"+indexResult); //创建配置映射 elasticsearchTemplate.putMapping(Good.class); System.out.println("配置映射结果:"+indexResult); } //删除索引 @Test public void deleteIndex(){ elasticsearchTemplate.deleteIndex(Good.class); } }
2、文档的常见增删改查
继承ElasticsearchRespository模板接口
-
/**
* 继承持久层接口的ElasticSearch的模板接口
*/
public interface GoodDao extends ElasticsearchRepository<Good,Long> {
}
测试类:
/**
* 目标:完成基本的增删改查操作
* 新增、修改、删除、根据id查询、查询所有、分页查询
* 步骤:
* 1.dao层接口继承ElasticSearchRepository的模板接口
* 2.编写业务层的所有方法
* 3.测试所有方法
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringdataEsGoodCRUD {
//注入Good业务层实现类
@Autowired
private GoodDao goodDao;
/**
* 新增
*/
@Test
public void save(){
Good good = new Good();
good.setId(1l);
good.setTitle("小米手机");
good.setCategory("手机");
good.setBrand("小米");
good.setPrice(19999.0);
good.setImages("http://image.leyou.com/12479122.jpg");
goodDao.save(good);
}
//修改
@Test
public void update(){
Good good = new Good();
good.setId(1l);
good.setTitle("小米手机");
good.setCategory("手机");
good.setBrand("小米");
good.setPrice(9999.0);
good.setImages("http://image.leyou.com/12479122.jpg");
goodDao.save(good);
}
//删除
@Test
public void delete(){
Good good = new Good();
good.setId(1l);
goodDao.delete(good);
}
//根据id查询
@Test
public void findById(){
Good good = goodDao.findById(2l).get();
System.out.println(good);
}
//查询所有
@Test
public void findAll(){
Iterable<Good> goods = goodDao.findAll();
for (Good good : goods) {
System.out.println(good);
}
}
//批量新增
@Test
public void saveAll(){
List<Good> goodList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Good good = new Good();
good.setId((long) i);
good.setTitle("["+i+"]小米手机");
good.setCategory("手机");
good.setBrand("小米");
good.setPrice(19999.0+i);
good.setImages("http://image.leyou.com/12479122.jpg");
goodList.add(good);
}
goodDao.saveAll(goodList);
}
//分页查询
@Test
public void findByPageable(){
//设置排序(排序方式,正序还是倒序,排序的id)
Sort sort = new Sort(Sort.Direction.DESC,"id");
int currentPage=2;//当前页
int pageSize = 100;//每页显示多少条
//设置查询分页
PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);
//分页查询
Page<Good> goodPage = goodDao.findAll(pageRequest);
for (Good good : goodPage.getContent()) {
System.out.println(good);
}
}
}
3、Search查询
ElasticSearch的search方法中QueryBuilders,就是第一章中的查询对象构建对象QueryBuilders。QueryBuilders具备的能力,search方法都具备。所以,在这里重复内容不赘述,仅举例term查询。
/**
* 目标:搜索
* term查询、match查询,match_all查询...
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringdataEsSearch {
//注入Good业务层实现类
@Autowired
private GoodDao goodDao;
/**
* term查询
* search(termQueryBuilder) 调用搜索方法,参数查询构建器对象
*/
@Test
public void termQuery(){
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");
Iterable<Good> goods = goodDao.search(termQueryBuilder);
for (Good g : goods) {
System.out.println(g);
}
}
/**
* term查询加分页
*/
@Test
public void termQueryByPage(){
int currentPage= 0 ;
int pageSize = 5;
//设置查询分页
PageRequest pageRequest = PageRequest.of(currentPage, pageSize);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");
Iterable<Good> goods = goodDao.search(termQueryBuilder,pageRequest);
for (Good g : goods) {
System.out.println(g);
}
}
}