本来觉得写这个没什么意义,感觉看看别人就够了,
然鹅,,,,被网上的坑的很惨
再次强调本文的环境:
2021年1月23日01:51:43的最新配置
spring boot 2.4版本
Elasticsearch的7.10.1版本
如果你环境差距不大,恭喜你,这片文章很适用你
注:本文讲解基础的操作,复杂的查询等可以参考参考spring文档(开个翻译就行了)
如果你是刚刚入门是不是有各种奇怪的情况,你发现你的Spring data elasticsearch好像不能正常用?
恭喜你,本人已经找到了Spring data elasticsearch与Elasticsearch的版本差异问题,参考下文,正常返航
啰里啰嗦(可以跳过
Spring data elasticsearch是个啥?
spring data是spring的一个子项目,为了使带伙使用不同的数据源,都有当初那个她的味道。
正文
来个最简单的demo
都用spring data了,建个项目应该会吧,狗头
这是最低项目依赖(Spring data elasticsearch依赖了web模块)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
配置文件
spring:
elasticsearch:
rest:
uris: localhost:9200
connection-timeout: 1s
read-timeout: 30s
数据类
@Document(indexName = "test_create")
public class D2 {
@Id
private Integer id;
@Field
private String title;
public D2() {
}
public D2(Integer id, String title) {
this.id = id;
this.title = title;
}
public Integer getId() {
return id;
}
public String getTitle() {
return title;
}
@Override
public String toString() {
return "D2{" +
"id=" + id +
", title='" + title + '\'' +
'}';
}
}
测试类
@SpringBootTest
public class SimpleOpt {
@Autowired
ElasticsearchOperations elasticsearchOperations;
@Test
void testCreateGetD2(){
D2 d = elasticsearchOperations.get("1",D2.class);
System.out.println(d);
}
@Test
void testCreatePut(){
D2 d=elasticsearchOperations.save(new D2(1, "增加一个"));
System.out.println(d);
}
@Test
void testCreateIndex(){
boolean b= elasticsearchOperations.indexOps(D2.class).create();
Assertions.assertTrue(b);
}
}
运行,没问题就成功了
下面谈谈各项细节
首先是配置,
spring连接ES有两种方式,TransportClient与RestHighLevelClient
目前推荐使用RestHighLevelClient ,另一种已经被弃用了(在部分环境有问题)
那么如何配置RestHighLevelClient?
两种办法:配置文件或配置类
配置文件只能配置个基础的设置,如果要多定制一些如Headr,ssl的配置,就要使用配置类了
上面已经给了配置文件,下面把配置类给大家
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Bean
@Override
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
// .usingSsl()
// .withProxy("localhost:8888")
// .withPathPrefix("ela")
.withConnectTimeout(Duration.ofSeconds(5))
.withSocketTimeout(Duration.ofSeconds(3))
// . // ... other options
.build();
return RestClients.create(clientConfiguration).rest();
}
}
下面是各项配置的细锁
(翻译有点夹,生谷歌传统艺能,各位担待担待)
下面说一下这个实体类
@Document标注了一个文档主题,对应了mysql中的库,只有一个表
这里一定要歪一嘴,ES在7版本开始,就逐渐不再支持多个Type了,这也是出现很多版本不适应问题的原因
7版本支持多个type,8版本好像就移除了
文档看这里https://www.elastic.co/cn/blog/moving-from-types-to-typeless-apis-in-elasticsearch-7-0
这是查询的接口http://localhost:9200/test/_doc/1(_doc是默认type)
与此同时,@Document注解也做了相关适应,新版本的注解移除了type字段,好家伙,我xx直接好家伙
这个注解目前的作用就是设定一下index的用处最大了(还有个是否自动创建index)
so,
@Document(indexName = “test_create”)就够一般使用了
然后是@Id,Id对应了ES中的id
然后是@Field,可以设定类型,那么等等
Spring data elasticsearch会解析类中的所有字段,除了
@Transient
:默认情况下,存储或检索文档时,所有字段都映射到文档,此注释不包括该字段。
然后是怎么用这个框架
建议使用注入ElasticsearchOperations
接口
而不是ElasticsearchRestTemplate
其实是等效的,但是使用前者更解耦,底层使用哪种实现都可以
ElasticsearchOperations是最近改动了的,里面有一大堆过时方法,一大堆新方法
他拥有修改index、CRUD数据、搜索的功能
上面我们已经给了几个demo
详细内容使用可以看看
https://docs.spring.io/spring-data/elasticsearch/docs/4.1.3/api/
除此之外,我们还能用spring data的风格操作数据
在项目中增加一个接口
@Repository
public interface DataDao extends PagingAndSortingRepository<Data, Integer> {
}
我们就有了CRUD、分页查询的能力,很爽
另外这里的分页查询体系也是spring data的体系,本人觉得有必要看看的,可以用来平时使用