Соединение Elasticsearch TransportClient [Java]

Я использую Эластичный поиск в Java-проект, используя Мавен:

...
 <elasticsearch.version>6.7.0</elasticsearch.version>
...
    <!-- Elasticsearch -->
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch.plugin</groupId>
        <artifactId>transport-netty4-client</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.8.2</version>
    </dependency>
    <!-- Elasticsearch -->        

Когда я пытаюсь инициализировать TransportClient для индексации документа, он выдает ошибку:

    NoNodeAvailableException[None of the configured nodes are available: 
    [{#transport#-1}{BHMBbfcrSUOM_Pyaf1LcnA}{localhost}{127.0.0.1:9300}]]

Возможно, нужно добавить больше информации в config/elasticsearch.yaml о транспорте, или текущая конфигурация неверна.

Java-код:

    TransportAddress address;
    TransportClient client;
    Settings settings;

    try {
        address = new TransportAddress(InetAddress.getByName("localhost"), 9300);
        settings = Settings
                    .builder()
                    .put("cluster.name", "lib2life")
                    .put("client.transport.sniff", true)
                    .build();

        /* Initiate Transport Client */
        client = new PreBuiltTransportClient(settings)
                    .addTransportAddress(address);

        /* Verify it cluster is healthy */
        ClusterHealthResponse clusterResponse = client
                    .admin()
                    .cluster()
                    .prepareHealth()
                    .setWaitForGreenStatus()
                    .setTimeout(TimeValue.timeValueSeconds(5))
                    .execute() //Error here
                    .actionGet();

         ... (more code)
    }

эластичный поиск.yaml:

# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: lib2life
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1

network.host:localhost
network.transport.tcp.port:9300

#
# Set a custom port for HTTP:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
#

(Другая информация внутри elasticsearch.yaml прокомментирована)

локальный: 9200 дает мне:

{
  "name" : "IRINAMW7",
  "cluster_name" : "lib2life",
  "cluster_uuid" : "-wL1-xdESnyoknD2ZqALDQ",
  "version" : {
    "number" : "7.1.1",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "7a013de",
    "build_date" : "2019-05-23T14:04:00.380842Z",
    "build_snapshot" : false,
    "lucene_version" : "8.0.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
982
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема связана с конфигурацией вашего порта, вы используете порт 9300 для вызова REST, который фактически используется для связи между узлами в кластере elasticsearch. пожалуйста, измените приведенный ниже код Java, чтобы использовать порт 9200.

address = new TransportAddress(InetAddress.getByName("localhost"), 9200);

Пожалуйста, прочитайте больше о портах es https://discuss.elastic.co/t/elasticsearch-port-9200-or-9300/72080/2

По-прежнему выдает: NoNodeAvailableException[Ни один из настроенных узлов недоступен: [{#transport#-1}{QJvbXzFLR8mOzAbajIUI1Q}{localhost}{127.0.0.‌​1:9200}]]

WhiteW 17.07.2019 14:43

@WhiteW, вы используете и ES, и свое приложение в одной системе?

Amit 17.07.2019 16:47

@WhiteW также, почему порт 9200 прокомментирован в вашем .yml

Amit 17.07.2019 18:12

Да, я также использую сервер Grizzly, который по умолчанию работает на порту 8080. Порт HTTP 9200 прокомментирован в elasticsearch.yaml, потому что я думал, что порты 9200 и 9300 используются для разных областей, а мне нужен 9300.

WhiteW 18.07.2019 08:21

@WhiteW, это работает не так, гризли - это сервер приложений, который работает на порту 8080, но в вашем коде вы создаете клиента для сервера ES, который работает на портах 9200 и 9300, который используется для различных упомянутых случаев использования. в моей ссылке ответа, в вашем случае использования требуется порт 9200. поэтому вам нужно раскомментировать порт 9200, а затем перезапустить узел ES и снова протестировать его.

Amit 18.07.2019 08:25

Да, я понимаю, но все равно что-то не так, потому что не работает с cluster.name:lib2life и http.port:9200 в elasticsearch.yaml. TransportAdress: новый TransportAddress(InetAddress.getLocalHost(), 9200);

WhiteW 18.07.2019 08:34

Давайте продолжить обсуждение в чате.

Amit 18.07.2019 08:34
Ответ принят как подходящий

Я решил проблему. Проблема заключалась в том, что я использовал версию Elasticsearch 6.7.0 с TransportClient, которая устарела и заменена на RestHighLevelClient. Также мне пришлось использовать порт 9200 и раскомментировать http.port:9200 и discovery.seed_hosts:["host1", "host2"] из elasticsearch.yaml

Другие вопросы по теме