SpringBoot中使用Elasticsearch入门教程(上)
书接上文,学习了JPA形式的使用,咱们今天来看看进阶版ES原生API的使用有何不同
进阶版ES原生API的使用
1. 原理概述
如果有小伙伴去跟过ElasticsearchRepository
所封装操作方法的源码的话,会发现底层其实是通过ElasticsearchRestTemplate
实现的,再继续跟下去,实质是通过RestHighLevelClient
的API来操作ES
由此我们引出了今天的主角:RestHighLevelClient
和ElasticsearchRestTemplate
。他们分别是ES的默认客户端和对客户端一些公共条件构造封装的模板类。我们知道越底层的代码自由度越高,由于上篇中所封装的Repository不能满足所有场景,所以对于特殊场景的实现需要直接去操作底层的API来实现,这也是我们学习下篇的原因之一。
2. 学习目标
- Elasticsearch的DSL语法掌握
- 熟悉spring boot中的条件构造类,能达到基础DSL语法效果
- 尝试聚合索引实现
3. Start正文
a.环境搭建及相关配置信息
同上篇一致,可参看SpringBoot中使用Elasticsearch入门教程(上)
b.Elasticsearch的DSL语法学习
如果已学习过可跳过此节。
如果还未学习过,可先学习DSL语法,再结合本文案例理解更深。
由于ES官方对DSL语法已有很详细的文档,此处直接贴上官网链接:
英文版,可选择不同ES版本:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/query-dsl.html
中文版,基于ES 2.x 版本,有些内容可能已经过时:https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-in-depth.html
c.代码示例
- 创建Document对象
/**
* <h3>spring-data-elasticsearch-demo</h3>
* <p></p>
*
* @author yingKang
* @date 2020年6月27日
*/
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "demo-use-log2")
public class UseLogTwoDO {
@Id
private String id;
private Integer sortNo;
@Field(type = FieldType.Keyword)
private String result;
private Date createTime;
}
- demo测试基础DSL语法
首先我们要注入RestHighLevelClient
和ElasticsearchRestTemplate
类
/**
* {@link ElasticsearchRestTemplate} 本质是基于 {@link RestHighLevelClient} 进行封装的一个template,
* 让我们在使用highLevelClient时减少了一些公共条件构造的冗余代码,操作ES时代码更加简洁明了
*/
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* Java高级Rest客户端是spring提供的默认客户端,低级客户端已被标记过时
*/
@Autowired
private RestHighLevelClient highLevelClient;
- 创建索引实现
示例testCreateIndex1()
中,通过ElasticsearchRestTemplate
来创建了一个IndexOperations
(是从4.0版本开始单独封装对Index的操作类)对象,整体代码简洁;而在testCreateIndex2()
中,则需要显示地指定IndexName和setting设置。两者实现的功能一致,但在代码整洁度上却相差较多。
/**
* template创建索引
* 通过参看create源码,可以看到底层对{@link RestHighLevelClient}的调用,
* 其实同{@link EsSecondDemoTest#testCreateIndex2()}方法一致
*
*/
@Test
void testCreateIndex1() {
IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(UseLogTwoDO.class);
if (!indexOperations.exists()) {
indexOperations.create();
System.out.println("Create successfully!");
}else {
System.out.println("Index has been created!");
}
}
/**
* client创建索引
*/
@Test
void testCreateIndex2() {
try {
String indexName = "demo-use-log2";
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
createIndexRequest.settings(getSettings());