Spring data elasticsearch简单上手 | ES-7版本,springboot 2.4

本来觉得写这个没什么意义,感觉看看别人就够了,
然鹅,,,,被网上的坑的很惨

再次强调本文的环境:
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的体系,本人觉得有必要看看的,可以用来平时使用

猜你喜欢

转载自blog.csdn.net/weixin_44494373/article/details/113008876