Как создать индекс эластичного поиска с помощью клиента REST высокого уровня JAVA?
Я просматривал эти документы, чтобы создать эластичный поисковый индекс из клиента JAVA REST высокого уровня Elastic. Кажется, что я пропустил шаги для аутентификации с моей учетной записью эластичного облака. Кто-нибудь может указать мне на соответствующую документацию?
Я запустил свой экземпляр эластичного поиска и скопировал URL-адрес конечной точки в свой клиентский код.
У меня изначально были ошибки подключения, а теперь их нет. Только ошибки аутентификации. Итак, я почти уверен, что подключаюсь к правильному URL-адресу конечной точки, и мне нужно как-то аутентифицироваться - возможно, с помощью заголовка.
Теперь я вижу эту ошибку:
Исключение Elasticsearch [тип = исключение_безопасности, причина = действие [индексы: данные / запись / индекс] требует аутентификации]
Я могу без проблем просматривать конечную точку развертывания эластичного поиска из Postman с помощью этой команды: GET https://:@d97215aee2.us-east-1.aws.found.io:9243
Я также могу создать индекс, используя эту команду из Postman... PUT https://elastic:4YQIMXfoSZ9mXPgY1fj7T5BU@d97218f74f6d48489b355dd7d665aee2.us-east-1.aws.found.io:9243/. Однако я не могу сделать то же самое с кодом Java.
Вот состояние моего кода Java. Это в значительной степени код с этих страниц руководства.
import java.io.IOException;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
@Path("/elasticsearch")
public class ElasticSearchService {
@POST
public void createElasticIndex() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("d9<deleted a bunch of characters for privacy>7d665aee2.us-east-1.aws.found.io", 9243, "https")));
IndexRequest request = new IndexRequest(
"posts",
"doc",
"1");
String jsonString = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"2013-01-30\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
request.source(jsonString, XContentType.JSON);
client.close();
}
}
Я также попытался обновить URL-адрес с нашим именем пользователя и паролем, как это было предложено в этом сообщении: Ошибка аутентификации ElasticSearch с ElasticCloud?
По сути, я обновил свой URL вот так...
RestClient.builder(
new HttpHost(
"<my user name>:<my password>@d97218<hidden characters>d665aee2.us-east-1.aws.found.io",
9243, "https")));
У меня это не сработало. Я предполагаю, что этот человек не использовал новый клиент Elastic High Level REST. Я получил эту ошибку:
org.glassfish.jersey.server.internal.process.MappableException: java.io.IOException::@d97265aee2.us-east-1.aws.found.io: недопустимый адрес IPv6
3 ответа
Нашел ответ здесь: введите описание ссылки здесь
Обновленный код, который работает:
import java.io.IOException;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.RestStatus;
@Path("/elasticsearch")
public class ElasticSearchService {
private static final String ELASTIC_SEARCH_USER_NAME = <my elastic search username>;
private static final String ELASTIC_SEARCH_PASSWORD = <my elastic search password>;
private static final String ELASTIC_SEARCH_ENDPOINT_URL = <my elastic search endpoint url>
private static final Integer ELASTIC_SEARCH_PORT = 9243;
@POST
public void createElasticIndex() throws IOException {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(ELASTIC_SEARCH_USER_NAME, ELASTIC_SEARCH_PASSWORD));
RestClientBuilder builder = RestClient
.builder(new HttpHost(
ELASTIC_SEARCH_ENDPOINT_URL,
ELASTIC_SEARCH_PORT, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
IndexRequest request = new IndexRequest(
"contacts",
"doc",
"1");
String jsonString = "{" +
"\"user\":\"frank\"," +
"\"postDate\":\"2020-03-02\"," +
"\"message\":\"created this document from Java\"" +
"}";
request.source(jsonString, XContentType.JSON);
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(response);
} catch (ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) {
}
}
client.close();
}
}
Этот код создает индекс с именем contacts
и добавляет документ в этот индекс.
Если вы знаете, как вставлять документы через API, то вам будет намного проще делать что-либо подобное API (DELETE,POST,PUT...). Во-первых, вам понадобится RestHighLevelClient и все, что вам нужно сделать.
String index = "/indexName/_doc";
Request request = new Request("POST", index);
request.setJsonEntity(
"{ \"message\": \" example add insert\" }"
);
client.getLowLevelClient().performRequest(request);
Это будет выполняться так же, как это делает API.
Для создания индекса можно использовать как синхронный, так и асинхронный API эластичного поиска. Но это зависит от требований.
Найдите приведенную ниже ссылку на документацию по эластичному поиску, в которой объясняется использование как синхронного, так и асинхронного API. https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-create-index.html
Пример кода:- Синхронный API:-
CreateIndexRequest request = new CreateIndexRequest("twitter");
request.settings(Settings.builder()
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 2)
);
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
Асинхронный API:-
client.indices().createAsync(request, RequestOptions.DEFAULT, listener);
Асинхронный API добавляет преимущества потоков и улучшает работу API. Проблема в асинхронном API - получение ответа. Ниже приведен фрагмент, как получить ответ.
PlainActionFuture<CreateIndexResponse > future = new PlainActionFuture<>();
client.indices().createAsync(request, RequestOptions.DEFAULT, future);
CreateIndexResponse response = future.actionGet();