0

我正在尝试使用JEST添加对Titan ES 客户端的 Elasticsearch HTTP 访问。Titan-es 仅支持 ES 的本地和传输 (TCP) 模式。但我想支持通过 ES 的 HTTP 接口进行通信。这将允许客户端库喜欢使用AWS Elasticsearch作为仅提供 HTTP(S) 接口的索引后端。有关更多信息,请参阅此帖子titan-es

我正在寻找一些关于我目前正在考虑的方法的反馈:

  1. 创建一个ElasticsearchHttpClient实现org.elasticache.client.Client接口的新类。新类将使用它JestClient作为它的内部客户端。这样它将通过 HTTP 与 ES 通信。新类可能会扩展 ES'AbstractClient以减少必须实现的方法:admin()settings()execute()threadPool()close()
  2. 添加一个新的枚举HTTP_CLIENTElasticSearchSetup
  3. 确保connect()on 方法HTTP_CLIENT返回一个实例,该实例包含和Connection的正确值。该成员将是新类的一个实例。nodeclientclientElasticsearchHttpClient
  4. 如果配置为 ,请确保该方法检索(包含新的)ElasticSearchIndex.interfaceConfiguration()的正确实例。从那时起,其余代码应该继续在新协议上工作。ConnectionElasticsearchHttpClientINTERFACEHTTP_CLIENT

这听起来应该有效吗?第一步是我最关心的问题——我不相信我可以使用 JestClient 实现所有客户端方法。

package com.thinkaurelius.titan.diskstorage.es;

import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.JestResult;
import io.searchbox.client.config.HttpClientConfig;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.*;
import org.elasticsearch.client.AdminClient;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.support.AbstractClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.threadpool.ThreadPool;

import java.io.IOException;

public class ElasticsearchHttpClient extends AbstractClient {
    private final JestClient internalClient;
    private final ThreadPool pool;

    public ElasticsearchHttpClient(String hostname, int port) {
        JestClientFactory factory = new JestClientFactory();
        factory.setHttpClientConfig(new HttpClientConfig
                .Builder(String.format("http://%s:%d", hostname, port))
                .multiThreaded(true)
                .build());
        JestClient client = factory.getObject();

        this.pool = new ThreadPool("jest");
        this.internalClient = client;
    }

    @Override
    public AdminClient admin() {
        return null;
    }

    @Override
    public Settings settings() {
        return null;
    }

    @Override
    public <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder, Client>> ActionFuture<Response> execute(Action<Request, Response, RequestBuilder, Client> action, Request request) {
        try {
            JestResult response = internalClient.execute(convertRequest(action, request));
            return convertResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder, Client>> void execute(Action<Request, Response, RequestBuilder, Client> action, Request request, ActionListener<Response> listener) {
        execute(action, request);
    }

    private <Response extends ActionResponse> ActionFuture<Response> convertResponse(JestResult result) {
        // TODO How to convert a JestResult a Elasticsearch ActionResponse/ActionFuture?
        return null;
    }

    private <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder, Client>> io.searchbox.action.Action<JestResult> convertRequest(Action<Request, Response, RequestBuilder, Client> action, Request request) {
        // TODO How to convert an Elasticsearch Action<..> and Request to a Jest Action<JestResult>?
        return null;
    }

    @Override
    public ThreadPool threadPool() {
        return pool;
    }

    @Override
    public void close() throws ElasticsearchException {
        pool.shutdownNow();
    }
}

[我也在Titan 邮件列表Elasticsearch 论坛上问过这个问题。]

4

1 回答 1

2

我已经在Titan 邮件列表中发布了一个答案。

从 Titan 的角度来看,您需要做的是实现 IndexProvider 接口。我的猜测是让 Jest 看起来像一个完整的 Elasticsearch 客户端是不可行的。

我想你会使用 JestHttpClient——你不需要实现 Jest 接口。IndexProvider 具有创建/删除/变异/查询索引的方法,您应该能够通过 HTTP 完成这些操作。检查 Elasticsearch HTTP 文档,看看您是否可以使用 JestHttpClient 对 IndexProvider 执行所有必需的方法。

IndexProvider 已经有一个 ElasticSearchIndex 实现,它执行 NODE 和 TRANSPORT。您正在尝试添加 HTTP 或 JEST 选项。因此,您可能会考虑将您的更改硬塞到 ElasticSearchIndex 中,但我不确定这将如何奏效,因为 2 个现有的 impl 都是完整的 Elasticsearch 客户端。如果它更干净,也许考虑创建一个单独的 ElasticSearchHttpIndex 实现 IndexProvider 。

于 2016-01-15T19:54:35.057 回答