es相关的官方客户端与spring客户端对比与介绍

601 阅读4分钟

1. 客户端版本种类

  1. ==es提供的==

    1. TransportClient
      1. 传统的客户端,基于TCP传输协议与Elasticsearch通信。
      2. 已经被弃用,不推荐使用。
        1. ==适用于Elasticsearch 5.x及以前的版本==
        2. 因为Elasticsearch 6.x及以上版本已不再支持TCP Transport协议,TransportClient无法连接Elasticsearch集群。
    2. RestHighLevelClient
      1. 是一个高级的REST客户端,主要用于与Elasticsearch集群通信。
      2. 基于Java Low Level REST Client构建,提供更高级的API,隐藏底层细节。
      3. 主要用于Kibana和Logstash等工具。
      4. ==RestHighLevelClient适用于Elasticsearch 6.2.0及以上版本。==
  2. ==spring提供的==

    1. ES存储库操作:==简单的CRUD==
      1. 特点
        1. 当你需要进行简单的CRUD操作(创建、读取、更新、删除文档)时,使用ES存储库操作是一个不错的选择。
        2. 这是因为Spring Data Elasticsearch会自动生成存储库接口的实现,从而使你的代码更简洁、易于理解。
    2. ElasticsearchTemplate
      1. 基于ElasticsearchRestTemplate封装,提供更高级的API,如各种CRUD操作。
      2. 也需要依赖Spring Framework。
    3. ElasticsearchRestTemplate
      1. 是一个Spring的RestTemplate的扩展,用于与Elasticsearch RESTful API交互。
      2. 基于Spring的RestTemplate,提供Elasticsearch的自动化JSON序列化和反序列化。
      3. 需要依赖Spring Framework。
    4. ElasticsearchOperations:接口实现
    5. 使用选择
      1. 如果需要更多spring集成相关的功能,则使用ElasticsearchTemplate。

      2. 如果需要直接访问Elasticsearch RESTful接口,则使用ElasticsearchRestTemplate。

      3. 性能和功能上,ElasticsearchTemplate略胜一筹。

2. spring的相关操作客户端

2.1 ES存储库操作:==简单的CRUD==

  1. 特点

    1. 当你需要进行简单的CRUD操作(创建、读取、更新、删除文档)时,使用ES存储库操作是一个不错的选择。
    2. 这是因为Spring Data Elasticsearch会自动生成存储库接口的实现,从而使你的代码更简洁、易于理解。
  2. 核心

    • ==简单的crud操作==
    • ==不支持复杂的查询检索==
  3. 使用步骤

    1. 实体类

      @Document(indexName = "encrypt_log", type = "encrypt_log")
      public class EncryptLogEntity {
        
          //对应字段
          private String srcIp;
          private String dstIp;
          //...
          
          // getters and setters
      }
      
      
    2. 创建ElasticsearchRepository接口

      public interface EncryptLogRepository extends ElasticsearchRepository<EncryptLogEntity, String> {
          
      }
      
    3. 对应的服务中注入接口,并编写方法

      @Autowired
      private MyDocumentRepository myDocumentRepository;
      
      // 创建文档
      myDocumentRepository.save(document);
      
      // 读取文档
      MyDocument document = myDocumentRepository.findById(id).orElse(null);
      
      // 更新文档
      myDocumentRepository.save(updatedDocument);
      
      // 删除文档
      myDocumentRepository.deleteById(id);
      

2.2 ElasticsearchTemplate:==复杂的操作:增删改查==

  1. 特点

    1. 当你需要执行更复杂的查询、聚合操作,或者需要使用一些特定的Elasticsearch功能时,使用ElasticsearchTemplate可能是一个更好的选择。
    2. ==基于 Transport Client与ES交互。==
  2. 核心

    • ==更复杂的查询、聚合操作 -> ElasticsearchTemplate==
    • 需要更简单、方便地集成ES时,可以使用ElasticsearchTemplate。
  3. 使用

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    
    // 构建查询
    QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "example");
    
    // 执行查询
    SearchHits<MyDocument> searchHits = elasticsearchTemplate.search(new NativeSearchQueryBuilder()
            .withQuery(queryBuilder)
            .build(), MyDocument.class);
    
    
  4. 简单查询例子

    @Autowired
    private ElasticsearchTemplate esTemplate;
    
    List<Map<String, Object>> documents = ...
    esTemplate.bulkIndex(documents);
    

2.3 ElasticsearchRestTemplate:==跨节点的搜索查询==

  1. 特点

    • ==适用于更复杂的查询操作==
  2. 情景

    • 需要更高级ES功能时,使用ElasticsearchRestTemplate。
    • 需要更高级ES功能时,使用ElasticsearchRestTemplate。
  3. 样例

    @Autowired
    private ElasticsearchRestTemplate esRestTemplate;
    
    List<Map<String, Object>> documents = ...
    esRestTemplate.bulkIndex(documents, Map.class);  
    
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
         .withQuery(matchQuery("name", "spring"))
         .build();
    List<Map> results = esRestTemplate.search(searchQuery, Map.class)
         .getContent();
    

2.4 ElasticsearchTemplate和ElasticsearchRestTemplate主要的区别在于

  1. 底层实现:

    • ElasticsearchTemplate 底层使用 Elasticsearch Java API 实现。
    • ElasticsearchRestTemplate 底层使用 Elasticsearch Rest API 实现。
  2. 使用范围:

    • ElasticsearchTemplate 只能在内部使用,不支持跨节点操作。
    • ElasticsearchRestTemplate 支持跨节点操作。
  3. 功能:

    • ElasticsearchTemplate 功能更全面,支持多种操作,如索引、搜索、删除等。
    • ElasticsearchRestTemplate 主要用于搜索。
  4. 性能:

    • ElasticsearchTemplate 性能更高,不需要经过 HTTP 请求。
    • ElasticsearchRestTemplate 需要通过 HTTP 请求,性能相对较低。
  5. 复杂度:

    • ElasticsearchTemplate 复杂度较高,需要深入理解 Elasticsearch Java API。
    • ElasticsearchRestTemplate 复杂度较低,只需要理解 Elasticsearch 的 REST API。
  6. 总的来说:

    • 如果只在==单个节点上操作 Elasticsearch,优先选择 ElasticsearchTemplate。==
    • 如果需要==跨节点操作,或者为了简单起见,可以选择 ElasticsearchRestTemplate。==

2.4 ElasticsearchOperations:接口

  1. 特点

    • ElasticsearchOperations是一个接口,代表了基础的Elasticsearch操作。
    • ElasticsearchTemplate是ElasticsearchOperations的一个实现。
  2. 功能

    1. ElasticsearchOperations定义了基本的Elasticsearch操作,如插入、查询、删除等。
    2. ElasticsearchTemplate实现了ElasticsearchOperations接口,提供了更多功能,例如:
      • 批量操作
      • 分页查询
      • 对复杂对象进行转换
      • 映射管理
      • 索引管理
  3. 使用

    1. 一般情况下,程序直接使用ElasticsearchTemplate。

    2. 在测试中,可以使用ElasticsearchOperations接口,达到分离依赖的目的。

3. 不同版本的依赖及对应方法的选择

  1. 进入spring对应的官网

  2. 随便找一个api——找到历史文档及版本对应版本对应

    99ce2f103035d2745477e933ed77870.png

  3. 然后找到对应的官方操作客户端方法

    d265d736da3e258e9e2181641a40542.png

4. 总结

  1. es客户端
    1. TransportClient :==已过时==
    2. RestHighLevelClient:==es官方推荐的版本,但有时候在spring中被废弃==
  2. spring客户端
    1. ES存储库
      • 适用于==简单的CRUD操作==
      • ==可阅读性强,操作编写难度麻烦==
    2. ElasticsearchTemplate
      • ==复杂的增删改查操作==
      • ==单节点中使用==
    3. ElasticsearchRestTemplate
      • ==多节点,和相对于ElasticsearchTemplate 更便捷的方法调用==
      • ==更加多样的查询封装方法==
    4. ElasticsearchOperations
      • ==是一个接口,使用的较少==