1. 客户端版本种类

  1. es提供的
  1. TransportClient
  1. 传统的客户端,基于TCP传输协议与Elasticsearch通信。
  2. 已经被弃用,不推荐使用。
  1. 适用于Elasticsearch 5.x及以前的版本
  2. 因为Elasticsearch 6.x及以上版本已不再支持TCP Transport协议,TransportClient无法连接Elasticsearch集群。
  1. RestHighLevelClient
  1. 是一个高级的REST客户端,主要用于与Elasticsearch集群通信。
  2. 基于Java Low Level REST Client构建,提供更高级的API,隐藏底层细节。
  3. 主要用于Kibana和Logstash等工具。
  4. RestHighLevelClient适用于Elasticsearch 6.2.0及以上版本。
  1. spring提供的
  1. ES存储库操作:简单的CRUD
  1. 特点
  1. 当你需要进行简单的CRUD操作(创建、读取、更新、删除文档)时,使用ES存储库操作是一个不错的选择。
  2. 这是因为Spring Data Elasticsearch会自动生成存储库接口的实现,从而使你的代码更简洁、易于理解。
  1. ElasticsearchTemplate
  1. 基于ElasticsearchRestTemplate封装,提供更高级的API,如各种CRUD操作。
  2. 也需要依赖Spring Framework。
  1. ElasticsearchRestTemplate
  1. 是一个Spring的RestTemplate的扩展,用于与Elasticsearch RESTful API交互。
  2. 基于Spring的RestTemplate,提供Elasticsearch的自动化JSON序列化和反序列化。
  3. 需要依赖Spring Framework。
  1. ElasticsearchOperations:接口实现
  2. 使用选择
  1. 如果需要更多spring集成相关的功能,则使用ElasticsearchTemplate。
  2. 如果需要直接访问Elasticsearch RESTful接口,则使用ElasticsearchRestTemplate。
  3. 性能和功能上,ElasticsearchTemplate略胜一筹。

2. spring的相关操作客户端

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

  1. 特点
  1. 当你需要进行简单的CRUD操作(创建、读取、更新、删除文档)时,使用ES存储库操作是一个不错的选择。
  2. 这是因为Spring Data Elasticsearch会自动生成存储库接口的实现,从而使你的代码更简洁、易于理解。
  1. 核心
  • 简单的crud操作
  • 不支持复杂的查询检索
  1. 使用步骤
  1. 实体类
@Document(indexName = "encrypt_log", type = "encrypt_log")
public class EncryptLogEntity {
  
    //对应字段
    private String srcIp;
    private String dstIp;
    //...
    
    // getters and setters
}
  1. 创建ElasticsearchRepository接口
public interface EncryptLogRepository extends ElasticsearchRepository<EncryptLogEntity, String> {
    
}
  1. 对应的服务中注入接口,并编写方法
@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交互。
  1. 核心
  • 更复杂的查询、聚合操作 -> ElasticsearchTemplate
  • 需要更简单、方便地集成ES时,可以使用ElasticsearchTemplate。
  1. 使用
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;

// 构建查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "example");

// 执行查询
SearchHits<MyDocument> searchHits = elasticsearchTemplate.search(new NativeSearchQueryBuilder()
        .withQuery(queryBuilder)
        .build(), MyDocument.class);
  1. 简单查询例子
@Autowired
private ElasticsearchTemplate esTemplate;

List<Map<String, Object>> documents = ...
esTemplate.bulkIndex(documents);

2.3 ElasticsearchRestTemplate:跨节点的搜索查询

  1. 特点
  • 适用于更复杂的查询操作
  1. 情景
  • 需要更高级ES功能时,使用ElasticsearchRestTemplate。
  • 需要更高级ES功能时,使用ElasticsearchRestTemplate。
  1. 样例
@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 实现。
  1. 使用范围:
  • ElasticsearchTemplate 只能在内部使用,不支持跨节点操作。
  • ElasticsearchRestTemplate 支持跨节点操作。
  1. 功能:
  • ElasticsearchTemplate 功能更全面,支持多种操作,如索引、搜索、删除等。
  • ElasticsearchRestTemplate 主要用于搜索。
  1. 性能:
  • ElasticsearchTemplate 性能更高,不需要经过 HTTP 请求。
  • ElasticsearchRestTemplate 需要通过 HTTP 请求,性能相对较低。
  1. 复杂度:
  • ElasticsearchTemplate 复杂度较高,需要深入理解 Elasticsearch Java API。
  • ElasticsearchRestTemplate 复杂度较低,只需要理解 Elasticsearch 的 REST API。
  1. 总的来说:
  • 如果只在单个节点上操作 Elasticsearch,优先选择 ElasticsearchTemplate。
  • 如果需要跨节点操作,或者为了简单起见,可以选择 ElasticsearchRestTemplate。

2.4 ElasticsearchOperations:接口

  1. 特点
  • ElasticsearchOperations是一个接口,代表了基础的Elasticsearch操作。
  • ElasticsearchTemplate是ElasticsearchOperations的一个实现。
  1. 功能
  1. ElasticsearchOperations定义了基本的Elasticsearch操作,如插入、查询、删除等。
  2. ElasticsearchTemplate实现了ElasticsearchOperations接口,提供了更多功能,例如:
  • 批量操作
  • 分页查询
  • 对复杂对象进行转换
  • 映射管理
  • 索引管理
  1. 使用
  1. 一般情况下,程序直接使用ElasticsearchTemplate。
  2. 在测试中,可以使用ElasticsearchOperations接口,达到分离依赖的目的。

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

  1. 进入spring对应的官网
  2. 随便找一个api——找到历史文档及版本对应版本对应
  3. 然后找到对应的官方操作客户端方法

4. 总结

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