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及以上版本。==
- TransportClient
-
==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略胜一筹。
-
- ES存储库操作:==简单的CRUD==
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交互。==
- 当你需要执行更复杂的查询、聚合操作,或者需要使用一些特定的Elasticsearch功能时,使用
-
核心
- ==更复杂的查询、聚合操作 -> 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
- ==是一个接口,使用的较少==
- ES存储库