SpringBoot整合Spring Data Elasticsearch的过程详解
作者:steakliu
Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射
elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多,
可以这样来对比elasticsearch和数据库
- 索引(indices)--------数据库(databases)
- 类型(type)------------数据表(table)
- 文档(Document)---------------- 行(row)
- 字段(Field)-------------------列(Columns )
整合:
1,在SprinBoot工程中引入jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
2,配置文件
spring.data.elasticsearch.cluster-name=elasticsearch //名字必须和elasticsearch.yml里面的cluster.name相同 spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300 spring.data.elasticsearch.repositories.enabled=true
3,创建实体,并对类和属性进行标注
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)//标记为文档类型,ndexName:对应索引库名称type:对应在索引库中的类型,shards:分片数量,默认5,replicas:副本数量,默认1 public class Item { @Id //主键 private Long id; @Field(type = FieldType.Text, analyzer = "ik_max_word") //标记为成员变量 FieldType,可以是text、long、short、date、integer等 text:存储数据时候,会自动分词,并生成索引 keyword:存储数据时候,不会分词建立索引 analyzer:分词器名称 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(index = false, type = FieldType.Keyword)//index:是否索引 private String images; // 图片地址
4.引入模板ElasticsearchTemplate
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
5.创建一个索引
//添加索引 @Test public void addIndex() { elasticsearchTemplate.createIndex(Item.class); }
6.删除索引
//删除索引 @Test public void delete(){ elasticsearchTemplate.deleteIndex("item"); }
7.新增对象
继承Repository提供的一些子接口,就能具备各种基本的CRUD功能,这里继承ElasticsearchCrudRepository
首先定义一个对象的接口
public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> { }
然后注入ItemRepository
@Autowired private ItemRepository itemRepository;
新增对象
//新增一个对象 @Test public void insert(){ Item item = new Item(2L,"坚果R1","手机","锤子",2500.00,"http://image.baidu.com/13123.jpg"); //Order order = new Order(20180020,"菜单"); itemRepository.save(item); }
批量新增
//批量新增 @Test public void insertList(){ List<Item> list = new LinkedList<>(); list.add(new Item(9L,"华为p20","手机","华为",3500.00,"http://image.baidu.com/13123.jpg")); list.add(new Item(10L,"华为p30","手机","华为",5450.00,"http://image.baidu.com/13123.jpg")); list.add(new Item(11L,"华为p30 pro","手机","华为",6980.00,"http://image.baidu.com/13123.jpg")); itemRepository.saveAll(list); }
8.查询
//根据字段查询所有 @Test public void queryAll(){ //升序,相应降序为dscending Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").ascending()); for (Item item : items){ System.out.println(item); } }
9.自定义查询方法
Spring Data 的另一个强大功能,是根据方法名称自动实现功能,你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定:
上图是截取csdn上博主我要取一个响亮的昵称的图
根据手机名查找手机
//自定义方法,根据Title查询 @Test public void findByTitle(){ Item item = this.itemRepository.findByTitle("坚果pro"); System.out.println(item); }
区间查询
//根据区间查询 @Test public void queryByPriceBetween(){ List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00); for (Item item : list) { System.out.println("item = " + item); } }
模糊查询
//模糊查询 @Test public void queryLikeTitle(){ List<Item> list = this.itemRepository.findByTitleLike("R2"); for (Item item : list){ System.out.println(item); } }
使用自定义方法需要在接口里面申明方法
public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> { Item findByTitle(String title); List<Item> findByPriceBetween(double price1, double price2); List<Item> findByTitleLike(String title); }
10.自定义查询
//自定义查询,查询数目等 @Test public void matchQuery(){ // 构建查询条件 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加基本分词查询 queryBuilder.withQuery(QueryBuilders.matchQuery("title","坚果")); //获取结果 Page<Item> items = (Page<Item>) this.itemRepository.findAll(); //条数 long total = items.getTotalElements(); System.out.println("total = "+total); for (Item item : items){ System.out.println(item); } }关键的是NativeSearchQueryBuilder这个类
分页查询
//分页查询 @Test public void queryByPage(){ NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手机")); int page = 0; int size = 2; nativeSearchQueryBuilder.withPageable(PageRequest.of(page,size)); Page<Item> items = (Page<Item>) this.itemRepository.findAll(); long total = items.getTotalElements(); int totalPage = items.getTotalPages(); int nowPage = items.getNumber(); int pageSize = items.getSize(); System.out.println("总条数 = "+total); System.out.println("总页数 = "+totalPage); System.out.println("当前页 = "+nowPage); System.out.println("每页大小 = "+pageSize); for (Item item : items){ System.out.println(item); } }
还有很多,就不意义列举
在elasticsearch-head上查看数据
关于安装elasticsearch-head,参考地址
Spring Data Elasticsearch文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.1.10.RELEASE/reference/html/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。