当前位置: 首页 > 知识库问答 >
问题:

从传输客户端到高级REST客户端的Elasticsearch升级路径

韩单弓
2023-03-14

使用Elasticsearch原生Java客户端API(TransportClient)的应用程序升级到使用Java高级REST客户端的路径是什么?

文件(初步?)似乎表明:

Java高级REST客户端依赖于Elasticsearch核心项目。它接受与TransportClient相同的请求参数,并返回相同的响应对象。

(来源:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.x/java-rest-high.html)

但我并不完全清楚这意味着什么。我是否能够在不重写查询或其他客户端类型操作的情况下,将整个代码库切换到高级REST客户端?REST客户端似乎没有实现客户端接口。从脱钩的角度来看,这可能是有道理的

我需要知道的是,我是否应该围绕客户机操作构建自己的抽象,或者HighLevelRestClient是否将基本上实现client接口。

我是否应该暂时继续针对TransportClient API编写代码,或者当TransportClient不推荐使用时,这些代码都需要重写?

请注意,我关注的是高级REST客户机,而不是低级REST客户机。

共有1个答案

严柏
2023-03-14

高级REST客户端不实现客户端接口。我不久前写的这篇博文描述了这个计划。

我们还正在编写文档,其中将包含一个页面,说明如何从传输客户端迁移。

新客户端重用来自现有传输客户端的请求和响应,但客户端对象不兼容,这意味着例如以下情况:

IndexRequest indexRequest = new IndexRequest("index", "type", "id");
indexRequest.source("field", "value");
IndexResponse indexResponse = transportClient.index(indexRequest).get();

会变成这样的东西:

IndexRequest indexRequest = new IndexRequest("index", "type", "id");
indexRequest.source("field", "value");
IndexResponse indexResponse = restHighLevelClient.index(indexRequest);

至于异步请求,调用略有不同(请参见方法名称),在新客户端中,我们选择了另一个名称以“async”后缀结尾的方法,您可以选择以下选项:

transportClient.index(indexRequest, new ActionListener<IndexResponse>() {
                    @Override
                    public void onResponse(IndexResponse indexResponse) {
                        // called when the operation is successfully completed
                    }

                    @Override
                    public void onFailure(Exception e) {
                        // called on failure
                    }
                });

以下是:

restHighLevelClient.indexAsync(indexRequest, new ActionListener<IndexResponse>() {
                @Override
                public void onResponse(IndexResponse indexResponse) {
                    // called when the operation is successfully completed
                }

                @Override
                public void onFailure(Exception e) {
                    // called on failure
                }
            });

不幸的是,客户端#准备*方法在高级客户端中不可用,因此类似于:

IndexResponse indexResponse = transportClient.prepareIndex("index", "type", "id").setSource("field", "value").get();

需要使用ActionRequests而不是ActionRequestBuilders将其迁移到上述位置。我们正在进行此更改,因为传输客户端中的请求和构建程序之间总是存在混淆,这两种方法完全相同。新客户端将使用单一方式提供请求。

如果您想查看当前的文档,它已经处于活动状态,但仍在进行中:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high.html .

高级REST客户端将取代传输客户端,尽管它的第一个即将发布的版本将只支持索引、批量、获取、删除、更新、搜索、搜索滚动和清除滚动API。接下来将支持缺失的API,我们也像往常一样欢迎用户的贡献。

Transport客户端将很快被弃用,因此我建议尽快转移到高级别REST客户端,这不应该是一个巨大的变化,它将得到回报,因为我们将不断改进,已经通过REST是一个很大的改进。

 类似资料:
  • 我正在尝试从ElasticSearch 2过渡到5或6。我想我想直接跳到6.1.1并使用RestHighLevelClient,因为它比低级rest客户端更接近我正在使用的现有传输客户端。 但是,我遇到了一个问题作为集成测试的一部分,我正在创建索引并插入特定数据,因此我知道我的查询是正确的。我似乎无法在High Level客户端中做到这一点。特别是,我希望能够调用: 但是,client.indic

  • 我正在尝试重建一个与elasticsearch 2.4对话的插件,以便与elasticsearch 5配合使用。 代码来自:https://github.com/pentaho/pentaho-kettle/blob/master/plugins/elasticsearch-bulk-insert/src/org/pentaho/di/trans/steps/elasticsearchbulk/E

  • 从Java使用弹性搜索的最佳实践是什么?例如,可以使用REST API轻松找到留档和逐个查询删除功能的示例。传输客户端Java情况并非如此。 在哪里可以找到Java Transport Client的使用示例 Java Transport Client是否通过REST API覆盖了整个ElasticSearch功能,比如HTTP客户端

  • 我得到以下异常,而试图使用Elasticsearch高Rest客户端。 我使用的是Spring Boot 2.0.4和Elasticsearch 6.4版本。。用例只是用一些数据创建一个索引,然后检索相同的数据。。 我刚刚遵循了elasticsearch文档中的依赖项,并正确地进行了设置。 我对Gradle的依赖是 为了简单起见,给出了代码的简短版本。。 有人能帮忙吗?

  • 我正在尝试创建一个类,该类将通过Rest高级客户机自动写入ElasticSearch,并执行操作(create、createBatch、remove、removeBatch、update、updateBatch),这些操作都正常工作,我的测试用例都成功。为了增加一点灵活性,我想实现以下方法:(find、findAll、getFirsts(n)、getLasts(n))。find(key)和find

  • 这是我的第一个问题。我必须使用ES rest高级客户端。我的ES服务器是6.8。x、 所以我写了我的构建。gradle文件。 但我的项目依赖性如下所示。 Gradle:org.elasticsearch.client:elasticsearch ch-rest-客户端:7.6.2 Gradle:org.elasticsearch.client:elasticsearch ch-rest-高级别-客