Я пытаюсь добавить HTTP-доступ Elasticsearch к клиент Titan ES с использованием JEST. titan-es поддерживает только локальный и транспортный (TCP) режимы ES. Но я хотел бы поддерживать связь через HTTP-интерфейс ES. Это позволит клиентским библиотекам, таким как titan-es
, использовать AWS Elasticsearch в качестве серверной части индексирования, которая предоставляет только HTTP (С) интерфейс. Дополнительную информацию см. в этом сообщении.
Я ищу некоторые отзывы о подходе, который я рассматриваю до сих пор:
- Создайте новый класс
ElasticsearchHttpClient
, реализующий интерфейсorg.elasticache.client.Client
. Новый класс будет использоватьJestClient
в качестве внутреннего клиента. Таким образом, он будет связываться с ES через HTTP. Новый класс, скорее всего, расширит ES'AbstractClient
, чтобы сократить методы, которые должны быть реализованы, до:admin()
,settings()
,execute()
,threadPool()
иclose()
. - Добавьте новое перечисление
HTTP_CLIENT
вElasticSearchSetup
- Убедитесь, что метод
connect()
дляHTTP_CLIENT
возвращает экземплярConnection
, который содержит правильные значения дляnode
иclient
. Членclient
будет экземпляром нового классаElasticsearchHttpClient
. - Убедитесь, что метод
ElasticSearchIndex.interfaceConfiguration()
извлекает правильный экземплярConnection
(содержащий новыйElasticsearchHttpClient
), еслиINTERFACE
настроен какHTTP_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.]