1. 客户端版本种类
- es提供的
- TransportClient
- 传统的客户端,基于TCP传输协议与Elasticsearch通信。
- 已经被弃用,不推荐使用。
- 适用于Elasticsearch 5.x及以前的版本
- 因为Elasticsearch 6.x及以上版本已不再支持TCP Transport协议,TransportClient无法连接Elasticsearch集群。
- RestHighLevelClient
- 是一个高级的REST客户端,主要用于与Elasticsearch集群通信。
- 基于Java Low Level REST Client构建,提供更高级的API,隐藏底层细节。
- 主要用于Kibana和Logstash等工具。
- RestHighLevelClient适用于Elasticsearch 6.2.0及以上版本。
- spring提供的
- ES存储库操作:简单的CRUD
- 特点
- 当你需要进行简单的CRUD操作(创建、读取、更新、删除文档)时,使用ES存储库操作是一个不错的选择。
- 这是因为Spring Data Elasticsearch会自动生成存储库接口的实现,从而使你的代码更简洁、易于理解。
- ElasticsearchTemplate
- 基于ElasticsearchRestTemplate封装,提供更高级的API,如各种CRUD操作。
- 也需要依赖Spring Framework。
- ElasticsearchRestTemplate
- 是一个Spring的RestTemplate的扩展,用于与Elasticsearch RESTful API交互。
- 基于Spring的RestTemplate,提供Elasticsearch的自动化JSON序列化和反序列化。
- 需要依赖Spring Framework。
- ElasticsearchOperations:接口实现
- 使用选择
- 如果需要更多spring集成相关的功能,则使用ElasticsearchTemplate。
- 如果需要直接访问Elasticsearch RESTful接口,则使用ElasticsearchRestTemplate。
- 性能和功能上,ElasticsearchTemplate略胜一筹。
2. spring的相关操作客户端
2.1 ES存储库操作:简单的CRUD
- 特点
- 当你需要进行简单的CRUD操作(创建、读取、更新、删除文档)时,使用ES存储库操作是一个不错的选择。
- 这是因为Spring Data Elasticsearch会自动生成存储库接口的实现,从而使你的代码更简洁、易于理解。
- 核心
- 简单的crud操作
- 不支持复杂的查询检索
- 使用步骤
- 实体类
@Document(indexName = "encrypt_log", type = "encrypt_log")
public class EncryptLogEntity {
//对应字段
private String srcIp;
private String dstIp;
//...
// getters and setters
}
- 创建
ElasticsearchRepository
接口
public interface EncryptLogRepository extends ElasticsearchRepository<EncryptLogEntity, String> {
}
- 对应的服务中注入接口,并编写方法
@Autowired
private MyDocumentRepository myDocumentRepository;
// 创建文档
myDocumentRepository.save(document);
// 读取文档
MyDocument document = myDocumentRepository.findById(id).orElse(null);
// 更新文档
myDocumentRepository.save(updatedDocument);
// 删除文档
myDocumentRepository.deleteById(id);
2.2 ElasticsearchTemplate:复杂的操作:增删改查
- 特点
- 当你需要执行更复杂的查询、聚合操作,或者需要使用一些特定的Elasticsearch功能时,使用
ElasticsearchTemplate
可能是一个更好的选择。 - 基于 Transport Client与ES交互。
- 核心
- 更复杂的查询、聚合操作 -> ElasticsearchTemplate
- 需要更简单、方便地集成ES时,可以使用ElasticsearchTemplate。
- 使用
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
// 构建查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "example");
// 执行查询
SearchHits<MyDocument> searchHits = elasticsearchTemplate.search(new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.build(), MyDocument.class);
- 简单查询例子
@Autowired
private ElasticsearchTemplate esTemplate;
List<Map<String, Object>> documents = ...
esTemplate.bulkIndex(documents);
2.3 ElasticsearchRestTemplate:跨节点的搜索查询
- 特点
- 适用于更复杂的查询操作
- 情景
- 需要更高级ES功能时,使用ElasticsearchRestTemplate。
- 需要更高级ES功能时,使用ElasticsearchRestTemplate。
- 样例
@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主要的区别在于
- 底层实现:
- ElasticsearchTemplate 底层使用 Elasticsearch Java API 实现。
- ElasticsearchRestTemplate 底层使用 Elasticsearch Rest API 实现。
- 使用范围:
- ElasticsearchTemplate 只能在内部使用,不支持跨节点操作。
- ElasticsearchRestTemplate 支持跨节点操作。
- 功能:
- ElasticsearchTemplate 功能更全面,支持多种操作,如索引、搜索、删除等。
- ElasticsearchRestTemplate 主要用于搜索。
- 性能:
- ElasticsearchTemplate 性能更高,不需要经过 HTTP 请求。
- ElasticsearchRestTemplate 需要通过 HTTP 请求,性能相对较低。
- 复杂度:
- ElasticsearchTemplate 复杂度较高,需要深入理解 Elasticsearch Java API。
- ElasticsearchRestTemplate 复杂度较低,只需要理解 Elasticsearch 的 REST API。
- 总的来说:
- 如果只在单个节点上操作 Elasticsearch,优先选择 ElasticsearchTemplate。
- 如果需要跨节点操作,或者为了简单起见,可以选择 ElasticsearchRestTemplate。
2.4 ElasticsearchOperations:接口
- 特点
- ElasticsearchOperations是一个接口,代表了基础的Elasticsearch操作。
- ElasticsearchTemplate是ElasticsearchOperations的一个实现。
- 功能
- ElasticsearchOperations定义了基本的Elasticsearch操作,如插入、查询、删除等。
- ElasticsearchTemplate实现了ElasticsearchOperations接口,提供了更多功能,例如:
- 批量操作
- 分页查询
- 对复杂对象进行转换
- 映射管理
- 索引管理
- 使用
- 一般情况下,程序直接使用ElasticsearchTemplate。
- 在测试中,可以使用ElasticsearchOperations接口,达到分离依赖的目的。
3. 不同版本的依赖及对应方法的选择
- 进入spring对应的官网
- 随便找一个api——找到历史文档及版本对应版本对应
- 然后找到对应的官方操作客户端方法
4. 总结
- es客户端
- TransportClient :已过时
- RestHighLevelClient:es官方推荐的版本,但有时候在spring中被废弃
- spring客户端
- ES存储库
- 适用于简单的CRUD操作
- 可阅读性强,操作编写难度麻烦
- ElasticsearchTemplate
- 复杂的增删改查操作
- 单节点中使用
- ElasticsearchRestTemplate
- 多节点,和相对于ElasticsearchTemplate 更便捷的方法调用
- 更加多样的查询封装方法
- ElasticsearchOperations
- 是一个接口,使用的较少