ES学习记录(二)
目录
学习目标
- 基础目标
- 利用spring-boot-starter-data-elasticsearch,集成Elasticsearch
- 利用spring-boot-starter-data-elasticsearch提供的类,完成对索引和文档的curd
- 进阶目标
- 掌握 Spring官方文档QueryMethod介绍
- 了解什么是响应式,响应式跟普通的区别
一、Springboot与Elasticsearch
Spring boot 是java使用最广泛的框架,集成了很多开发常用到的组件,其中就包括ES
在java代码中集成ES其实也可以不依赖Spring boot
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${esClientVersion}</version>
#或者使用下面的依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${esHightLevelClientVersion}</version>
</dependency>
但是今天介绍的是Spring-data中集成的ES
二、Spring 集成ES
1.导入依赖
这里不需要标明version,因为spring boot会帮匹配当前spring boot框架对应的版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.添加配置类
public class MyConfig extends ElasticsearchConfiguration {
@Value("${elasticsearch.uris:localhost}")
private String host;
@Value("${elasticsearch.port:9200}")
private String port;
@Override
public ClientConfiguration clientConfiguration() {
log.info("imperative client....{}:{}",host,port);
return ClientConfiguration.builder()
.connectedTo(host+":"+port)
.build();
}
}
host 跟 port 需要根据自己的yml文件和es的配置文件修改
3.进行curd
新建ES entity
@Document(indexName = "test_es_index")
@Builder
@Data
public class TestESEntity {
@Id
private String id;
@Field(type = FieldType.Keyword)
private String testKeyword;
@Field(type = FieldType.Text)
private String testText;
}
@Document(indexName = “test_es_index”) 代表该实体存储在 test_es_index 索引中
@Field(type = FieldType.Text) 代表该字段类型是text
新建Repository
public interface ESRepository extends ElasticsearchRepository<TestESEntity, String> {
}
跟jpa类似,es的curd操作可以直接使用 ElasticsearchRepository 中封装好的方法,对于复杂查询可以使用 @Query 注解实现,但是也有另外的方法
4.Query methods
对于条件查询,可以手动写es查询的body,结合 @Query实现条件查询
也可以跟jpa类似,通过解析方法名获得查询结果
Spring官方文档QueryMethod介绍
5.响应式与及时式
在 Elasticsearch Clients 中介绍了两种Rest Client
- Imperative Rest Client
- Reactive Rest Client
从使用上看,二者并没有区别,取决于你是否采用响应式编程
题外:及时式于响应式
区分及时 or 响应,跟线程数量其实没有关系,举个例子,在单线程条件下,我先给A server发送请求,然后继续完成其他业务,等A server有返回了,我再继续进行下面的业务,这也是响应式
所以,简单地区分是否为响应式,要看是否为信息驱动去执行某种动作