一、主要内容
- spring boot 引入Elasticsearch
- ElasticsearchTemplate的使用
- ElasticsearchRepository的使用
二、环境整合
创建Elasticsearch工程,引入依赖
一般情况下,都会单独创建一个工程,用于操作es。
1 | pom复制代码<dependency> |
版本统一
目前springboot-data-elasticsearch
最新版本是2.5.1,这个版本使用的es版本为7.12.1,需要注意的是,我们这里引入的版本需要与服务器安装的版本一致。
可以通过Maven仓库进行查看版本信息,地址:mvnrepository.com/artifact/or…
修改配置文件
1 | yml复制代码spring: |
三、ElasticsearchTemplate的使用
ElasticsearchTemplate类似于RedisTemplate,是spring提供的较为底层的与Elasticserch交互的类。
常用注解
@Document
注解作用在类上,标记实体类为文档对象,指定实体类与索引对应关系。常用配置项有:
- indexName:索引名称
- type: 索引类型,默认为空
- shards: 主分片数量,默认5
- replicas:复制分片数量,默认1
- createIndex:创建索引,默认为true
@Id
指定文档ID,加上这个注解,文档的_id
会与我们的数据ID是一致的,否则在不给定默认值的情况下,es会自动创建。
@Field
指定普通属性,标明这个是文档中的一个字段。常用的配置项有:
- type: 对应Elasticsearch中属性类型。默认自动检测。使用FiledType枚举可以快速获取
1 | java复制代码public enum FieldType { |
- index: 是否创建倒排索引,一般不需要分词的属性不需要创建索引
- analyzer:指定索引类型。
- store:是否进行存储,默认不进行存储。
其实不管我们将store值设置为true或false,elasticsearch都会将该字段存储到Field域中;但是他们的区别是什么?
1. store = false时,默认设置;那么给字段只存储在"\_source"的Field域中; 2. store = true时,该字段的value会存储在一个跟\_source平级的独立Field域中;同时也会存储在\_source中,所以有两份拷贝。
那么我们在什么样的业务场景下使用store field功能?
1. \_source field在索引的mapping 中disable了。这种情况下,如果不将某个field定义成store=true,那些将无法在返回的查询结果中看到这个field。 2. \_source的内容非常大。这时候如果我们想要在返回的\_source document中解释出某个field的值的话,开销会很大(当然你也可以定义source filtering将减少network overhead),比例某个document中保存的是一本书,所以document中可能有这些field: title, date, content。假如我们只是想查询书的title 跟date信息,而不需要解释整个\_source(非常大),这个时候我们可以考虑将title, date这些field设置成store=true。
创建实体
1 | java复制代码// 关联的索引是item,类型是_doc,直接使用而不创建索引 |
索引管理
ElasticsearchTemplate提供了创建索引的方法,但是不建议使用 ElasticsearchTemplate 对索引进行管理(创建索引,更新映射,删除索引)。
索引就像是数据库或者数据库中的表,我们平时是不会是通过java代码频繁的去创建修改删除数据库或者表的相关信息,我们只会针对数据做CRUD的操作。
1 | java复制代码// 创建索引 |
创建文档
新增单条文档
1 | java复制代码@RunWith(SpringRunner.class) |
批量新增文档
1 | java复制代码@RunWith(SpringRunner.class) |
删除文档
删除都是根据主键进行删除,提供了两个方法:
- delete(String indexName,String typeName,String id); 通过字符串指定索引,类型和id值;
- delete(Class,String id) 第一个参数传递实体类类类型,建议使用此方法,减少索引名和类型名由于手动编写出现错误的概率。
代码比较简单,不再示例。
修改文档
1 | java复制代码@Test |
查询文档
模糊查询
使用查询条件与所有的field进行匹配,进行查询
对于一些入参是不是看着很陌生?感觉头大是不是,别急,最后有解释。
1 | java复制代码@Test |
使用match_all查询所有文档
1 | java复制代码@Test |
使用match查询分页文档并排序
1 | java复制代码@Test |
多条件查询
1 | java复制代码 @Test |
高亮查询
1 | java复制代码@Test |
四、ElasticsearchRepository的使用
ElasticsearchRepository是基于ElasticsearchTemplate封装的一个接口用于操作Elasticsearch。
它主要干了啥呢?我们能通过它干些什么呢?
- 它主要帮我们封装了一些常用的方法。如下图:
- 我们还可以通过使用
Not
Add
Like
Or
Between
等关键词自动创建查询语句。它会自动帮你完成,无需写实现类。
比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。
【自定义方法命名约定】:
自定义Repository接口
这个是遵循SpringData的规范,在自定义接口中直接指定查询方法名称便可查询,无需进行实现。在idea里面也会提示ES里面有的字段,写起来挺方便的。
1 | java复制代码/** |
创建文档
新增单条文档
可以直接调用ItemRepository
的save()
方法。
1 | java复制代码@Autowired |
批量新增文档
插入多条文档数据使用的saveAll()
方法
1 | java复制代码@Autowired |
修改文档
修改文档数据也是使用的save()
方法。
查询参数介绍
我们通过上面的方法截图,可以看出来ElasticsearchRepository
提供了一些特殊的search()
方法,用来构建一些查询。这几个方法里面的参数主要是SearchQuery
和QueryBuilder
,所以要完成一些特殊查询主要就是构建这两个参数。
SearchQuery
通过源码我们可以看到,SearchQuery
是一个接口,有一个实现类叫NativeSearchQuery
,实际使用中,我们的主要任务就是构建NativeSearchQuery
来完成一些复杂的查询的。
我们可以看到NativeSearchQuery
的主要入参是QueryBuilder
、SortBuilder
、HighlightBuilder
一般情况下,我们不是直接是new NativeSearchQuery
,而是使用NativeSearchQueryBuilder
来完成NativeSearchQuery的构建。
1 | scss复制代码NativeSearchQueryBuilder |
QueryBuilder
QueryBuilder是一个接口,它有非常多的实现类,可以用于不同的查询条件构建。
要构建QueryBuilder,我们可以使用工具类QueryBuilders,里面有大量的方法用来完成各种各样的QueryBuilder的构建,字符串的、Boolean型的、match的、地理范围的等等。
1 | java复制代码// 构建一个普通的查询 |
查询方法跟上面介绍的ElasticsearchTemplate
差不多,就不再单独举例了。
综上,我们在一般的场景下使用ElasticsearchRepository
就可以满足我们的需要,在一些复杂的查询场景下,可以配合ElasticsearchTemplate
来使用。
最后,欢迎关注「Hugh的白板」公号,私信我一起学习,一起成长!
最最后,如果对你有一点帮助,可否给一个赞?非常感谢哦~
本文转载自: 掘金