Как создать поисковый индекс elasti c с клиентом REST высокого уровня JAVA? - PullRequest
1 голос
/ 02 марта 2020

Я просматривал эти документы для создания поискового индекса elasti c из клиента REST высокого уровня JAVA Elasti c. Кажется, пропущены шаги для аутентификации с моей учетной записью elasti c cloud. Может ли кто-нибудь указать мне соответствующую документацию?

Я запустил свой экземпляр поиска elasti c и скопировал URL-адрес конечной точки в код моего клиента.

У меня изначально были ошибки подключения, и теперь есть никто. Только ошибки аутентификации. Итак, я почти уверен, что я соединяюсь с правильным URL-адресом конечной точки и должен как-то проходить аутентификацию - возможно, с заголовком.

Теперь я вижу эту ошибку:

Исключение Elasticsearch [тип = security_exception, причина = действие [индексы: данные / запись / индекс] требует проверки подлинности]

Я могу просмотреть конечную точку моего Elasti c Поисковое развертывание без проблем с почтальоном с эта команда: GET https://:@d97215aee2.us-east-1.aws.found.io: 9243

Я также могу создать индекс, используя эту команду из Почтальона ... PUT https://elastic:4YQIMXfoSZ9mXPgY1fj7T5BU@d97218f74f6d48489b355dd7d665aee2.us-east-1.aws.found.io: 9243 / . Тем не менее, я не могу сделать то же самое из кода Java.

Вот состояние моего кода Java. Это в значительной степени код этих страниц учебника.

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.4/java-rest-high-document-index.html

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")));

Это не сработало для меня. Я предполагаю, что этот человек не использовал новый клиент Elasti c High Level REST. Я получил эту ошибку:

org.glassfi sh .jersey.server.internal.process.MappableException: java .io.IOException: :@d97265aee2.us-east-1.aws.found.io: неверный адрес IPv6

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Вы можете использовать как синхронный, так и асинхронный API поиска elasti c для создания индекса. Но это зависит от требований.

Найдите приведенную ниже ссылку на поисковую документацию elasti c, которая объясняет как синхронное, так и асинхронное использование 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(); 
0 голосов
/ 02 марта 2020

Нашел ответ здесь: введите здесь описание ссылки

Обновлен работающий код:

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 и добавляет документ к этому индексу.

...