【Elasticsearch】java 集成es

选择

很多人在Spring boot项目中都已经习惯采用Spring家族封装的spring-data-elasticsearch来操作elasticsearch,而官方更推荐采用rest-client。
今天给大家介绍下在spring boot中如何整合rest-client操作elasticsearch。

我们知道Elasticsearch是一款Restful API风格的分布式搜索引擎。ES Client有两种连接方式:TransportClient 和 RestClient。TransportClient通过TCP方式访问ES,RestClient方式通过Http方式访问ES。ES在7.0中已经弃用TransportClient,在8.0中完全删除它,所以建议使用RestClient的方式。

RestClient方式有多种实现,比如:ES自带的RestHighLevelClient 、Springboot实现的ElasticsearchRestTemplate 。笔者建议使用RestHighLevelClient,原因有3个:

  • 使用RestHighLevelClient比较灵活,可以直接使用ES的DSL语法,实现复杂查询,同时没有与其他部件绑定,所以版本可以自由选择。
  • 由于ElasticsearchRestTemplate是spring-boot-starter-data-elasticsearch封装的工具类,虽然使用上稍微方便一些,但是失去了灵活性,出现问题时也不易排查。而且ElasticsearchRestTemplate本身与spring-boot-starter-data-elasticsearch紧密依赖。如果想升级ElasticsearchRestTemplate,那就必须连带升级项目的Springboot版本,这个风险就比较高了,一般项目的Springboot版本不会轻易升级。
  • 还有些第三方的插件,将SQL转成ES的DSL,笔者也不建议使用。它们即不灵活,更新速度也慢。这里也再次吐槽下,ES的DSL设计确实有点反人类,不过也不用死记,可以通过归类记忆核心内容,其余使用细节直接查阅官方文档就好。

整理来说,用ES提供的RestHighLevelClient是最稳定最方便的。由于使用RestHighLevelClient,多少会涉及到ES的DSL语法,详见官网:Match phrase query | Elasticsearch Guide [7.17] | Elastic。

为什么不使用Spring家族封装的spring-data-elasticsearch?

1、主要是灵活性和更新速度。
spring将elasticsearch过度封装,让开发者很难跟ES的DSL查询语句进行关联。再者就是更新速度,ES的更新速度是非常快的,但是spring-data-elasticsearch更新速度比较缓慢。
另外,spring-data-elasticsearch底层依赖的是TransportClient。而TransportClient在ES7中已被弃用,取而代之的是 Java 高级 REST 客户端,并将在 Elasticsearch 8.0 中删除。

2、ElasticsearchRepository的优缺点:
优点: 简单,SpringBoot无缝对接,配置简单;
缺点: 基于即将废弃的TransportClient, 不能支持复杂的业务;

基于此,强烈建议采用官方推出的java客户端elasticsearch-rest-high-level-client,它的代码写法跟DSL语句很相似,懂ES查询的使用其上手很快。ElasticsearchRestTemplate;

低级REST客户端和高级REST客户端的关系

使用Elasticsearch服务,则要先获取一个Elasticsearch客户端。获取Elasticsearch客户端的方法很简单,最常见的就是创建一个可以连接到集群的传输客户端对象。

在Elasticsearch中,客户端有初级客户端和高级客户端两种,它们均使用Elasticsearch提供了RESTful风格的API,在使用RESTful API时,一般通过9200端口与Elasticsearch进行通信。

初级客户端是Elasticsearch为用户提供的官方版初级客户端。初级客户端允许通过HTTP与Elasticsearch集群进行通信,它将请求封装发给Elasticsearch集群,将Elasticsearch集群的响应封装返回给用户。初级客户端与所有Elasticsearch版本都兼容。

高级客户端是用于弹性搜索的高级客户端,它基于初级客户端。高级客户端公开了API特定的方法,并负责处理未编组的请求和响应。

官网对java-rest客户端的特性介绍:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-low.html

java low-level client特性:

  • 最小依赖
  • 针对可用节点,负载均衡
  • 针对错误和故障节点可以进行故障转移
  • 针对某个节点连接失败次数越多,客户端就会等待更长的时间,才会再次尝试这个节点
  • 持久连接
  • 请求日志追踪
  • 原子性操作

java High-level client特性:

  • 在 Java 低级 REST 客户端之上运行
  • 主要目标是公开 API 特定的方法
  • 每个API都有同步和异步调用
  • Java High Level REST Client 依赖于 Elasticsearch 核心项目

简单来说:
low-level client 最小依赖,兼容性更好,使用更灵活。
High-level client基于low-level client ,它的主要目标是公开 API 特定的方法,封装性更好,使用更方便。

SpringBoot整合ElasticSearch7.x(high-rest-client)

1、添加maven依赖
    
        1.8
        7.10.2
        1.2.7.5.RELEASE
        true
    


        
        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
            
                
                    org.springframework.data
                    spring-data-elasticsearch
                
            
        

        
        
            org.elasticsearch.client
            elasticsearch-rest-client
            ${es.version}
        

        
        
            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            ${es.version}
            
                
                    org.elasticsearch
                    elasticsearch
                
            
        

     
        
            org.elasticsearch
            elasticsearch
            ${es.version}
        

若不引入 spring-boot-starter-data-elasticsearch 依赖,就需要添加配置类配置RestHighLevelClient:

@Data
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticSearchConfig {
 
    private String hosts;
    private Integer port;
 
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        HttpHost[] httpHosts = Arrays.stream(hosts.split(","))
                .filter(e -> !StringUtils.isEmpty(e))
                .map(e -> new HttpHost(e, port, "http"))
                .toArray(HttpHost[]::new);
 
        return new RestHighLevelClient(
                RestClient.builder(
                        httpHosts
                )
        );
    }
}

2、配置ES连接属性
spring:
  application:
    name: xxxx
  elasticsearch:
    rest:
      uris: 10.8.29.236:8601
      connection-timeout: 10s
      read-timeout: 30s
#      username: elastic
#      password: xxxxxxxxx
3、RestClient、RestHighLevelClient使用

SpringBoot整合ElasticSearch8.x(elasticsearch-java)

背景:
jdk1.8 
springboot版本 2.5.15

依赖:



    org.elasticsearch.client
    elasticsearch-rest-client
    8.4.2




    co.elastic.clients
    elasticsearch-java
    8.4.2



    com.fasterxml.jackson.core
    jackson-databind
    2.12.3



    jakarta.json
    jakarta.json-api
    2.0.1


注意:

1、elasticsearch-java 底层依赖 elasticsearch-rest-client,所以使用 elasticsearch-java 时注意springboot 版本提供的 elasticsearch-rest-client 版本,或者直接覆盖 springboot 提供的版本。

你可能感兴趣的:(elk,elasticsearch)