使用 Spring Data Elasticsearch 的 Elasticsearch Rest 客户端

Posted

技术标签:

【中文标题】使用 Spring Data Elasticsearch 的 Elasticsearch Rest 客户端【英文标题】:Elasticsearch Rest Client with Spring Data Elasticsearch 【发布时间】:2017-12-21 10:25:44 【问题描述】:

我正在使用 Spring boot 和 AWS elasticsearch 服务。仅提供 REST 接口的 AWS Elasticsearch 服务。

Elasticsearch Rest 客户端是here。

简单地说,是否可以将 REST 客户端与 Spring Data Elasticsearch 一起使用?

换句话说,Spring Data Elasticsearch 是否可以与 Elasticsearch Rest 客户端一起使用?

Spring Data Elasticsearch 非常易于使用,模板提供了我需要的大部分功能。使用 Elasicsearch Rest 客户端,我必须自己实现所有功能。

【问题讨论】:

Elastic Search 发布了 High Level Rest Client 及其动态构建采石场的好处 :) 【参考方案1】:

[2020 年 5 月更新]

https://spring.io/blog/2020/05/27/what-s-new-in-spring-data-elasticsearch-4-0

如您所见,Spring Data Elasticsearch 4.0:

Spring Data Elasticsearch 现在特别使用 Elasticsearch 7、7.6.2。不再支持在 6.x 版本上运行的 Elasticsearch 集群。不推荐使用 ElasticsearchTemplate 类,因为它使用 TransportClient 访问 Elasticsearch,自 Elasticsearch 版本 7 起,它本身已被弃用。用户应切换到 ElasticsearchRestTemplate 或 ReactiveElasticsearchTemplate。

[2019 年 2 月更新]

现在看到 3.2.0 M1 Spring Data Elasticsearch 支持 HTTP 客户端 (https://docs.spring.io/spring-data/elasticsearch/docs/3.2.0.M1/reference/html/#reference)

根据文档(当然可以更改,因为它不是最终版本,所以我会放在这里):

众所周知的 TransportClient 自 Elasticsearch 7.0.0 起已弃用,预计将在 Elasticsearch 8.0 中删除。

2.1。高级 REST 客户端

Java 高级 REST 客户端直接替代了 TransportClient,因为它接受并返回完全相同的请求/响应对象,因此依赖于 Elasticsearch 核心项目。异步调用在客户端管理的线程池上进行操作,并且需要在请求完成时通知回调。

示例 49. 高级 REST 客户端

static class Config 

  @Bean
  RestHighLevelClient client() 

    ClientConfiguration clientConfiguration = ClientConfiguration.builder() 
      .connectedTo("localhost:9200", "localhost:9201")
      .build();

    return RestClients.create(clientConfiguration).rest(); 
  


// ...

IndexRequest request = new IndexRequest("spring-data", "elasticsearch", randomID())
  .source(singletonMap("feature", "high-level-rest-client"))
  .setRefreshPolicy(IMMEDIATE);

IndexResponse response = client.index(request);

[原答案]

目前 Spring Data Elasticsearch 不支持通过 REST API 进行通信。他们正在使用传输客户端。

Spring Data Elasticsearch 有一个单独的分支(AWS 和你一样需要它),其中使用 JEST 库并通过 REST 进行通信:

https://github.com/VanRoy/spring-data-jest

你会在 Spring Data Elasticsearch 的下面打勾下找到有趣的讨论:

https://jira.spring.io/browse/DATAES-220

根据 Elasticsearch 团队的声明,他们计划仅支持 ES 的 HTTP 通信,我认为 Spring Data Elasticseach 未来需要迁移到 REST。

希望对你有帮助。

【讨论】:

有消息了吗? Spring Data Elasticsearch 在最新版本中是否支持 REST API? 如何在 Spring Data ES 3.2.0.M1 中使用 High Level Rest Client?看我的问题***.com/questions/54754790/…【参考方案2】:

我认为弹性搜索的开玩笑客户端将满足您的目的。 https://github.com/searchbox-io/Jest/tree/master/jest。 Jest 是 ElasticSearch 的 Java HTTP Rest 客户端。它也有很好的文档,并且支持 elasticsearch 中的所有查询。

【讨论】:

【参考方案3】:

无法评论上面 Przemek Nowak 的回答。如果您不想等待 Spring Data ES 2.2.x 使用 High Level Rest Client,那么Spring Data Jest 可以节省一天的时间。

根据他们的文档,您首先禁用默认的 Spring Data ES 自动配置:

@SpringBootApplication(exclude = 
    ElasticsearchAutoConfiguration.class, 
    ElasticsearchDataAutoConfiguration.class
)

就是这样 - 存储库现在将使用 Jest 的实现。如果您想使用ElasticsearchTemplate,请确保您注入ElasticsearchOperations 接口:

private final ElasticsearchOperations esTemplate;

【讨论】:

以上是关于使用 Spring Data Elasticsearch 的 Elasticsearch Rest 客户端的主要内容,如果未能解决你的问题,请参考以下文章

我可以在同一台机器上运行多个elasticsearch实例进行日志聚合吗?

无法将 Spring Data MongoDB + Spring Data JPA 与 Spring Boot 一起使用

使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?

Spring Boot(17)——使用Spring Data JPA

使用spring-data-solr做solr客户端

springboot :spring data jpa的使用