Индексация Elasticsearch не работает и сообщение об ошибке: нулевой узел не является частью кластера Cluster [elasticsearch], игнорируя

Я только что скачал эластичный поисковый дистрибутив и запустил его.

curl 'localhost:9200'

{
   "status" : 200,
   "name" : "cbs",
   "cluster_name" : "elasticsearch",
   "version" : {
   "number" : "1.4.1",
   "build_hash" : "89d3241d670db65f994242c8e8383b169779e2d4",
   "build_timestamp" : "2014-11-26T15:49:29Z",
   "build_snapshot" : false,
   "lucene_version" : "4.10.2"
    },
  "tagline" : "You Know, for Search"
}

И я пытаюсь получить к нему доступ, используя spring-data. Добавлены следующие строки в контексте приложения (согласно документации по весенним данным) с пространством имен xml:

<elasticsearch:repositories base-package="com.cbs" />
<elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300" cluster-name="elasticsearch" />
<bean name="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
    <constructor-arg name="client" ref="client" />
</bean>

Вот код сущности и репозитория:

@org.springframework.data.elasticsearch.annotations.Document(indexName = "product", type = "product", shards = 1, replicas = 0, indexStoreType = "memory", refreshInterval = "-1")
public class Product {
    @Id
    private String id;    
    private String name;
}


@Repository
public class ProductSearchDaoImpl implements IProductSearchDao {
@Autowired
private ElasticsearchOperations elasticsearchOperations;

@Override
public void index(Product product) {
    elasticsearchOperations.createIndex(Product.class);
    elasticsearchOperations.putMapping(Product.class);
    IndexQuery indexQuery = new IndexQueryBuilder().withId(product.getId()).withObject(product).build();
    elasticsearchOperations.index(indexQuery);
    elasticsearchOperations.refresh(Product.class, true);
}
}

Теперь, когда я запускаю тестовый пример для индексации продукта, я получаю последовательное предупреждающее сообщение (каждые 2 секунды или около того), как

[Neuronne] node null not part of the cluster Cluster [elasticsearch], ignoring...
[Neuronne] node null not part of the cluster Cluster [elasticsearch], ignoring...

И товар не индексируется (даже индекс не создается)

curl 'localhost:9200/_cat/indices?v'
health status index    pri rep docs.count docs.deleted store.size pri.store.size 

Может ли кто-нибудь помочь мне с этим?


person Sunny Agarwal    schedule 27.11.2014    source источник


Ответы (2)


Для тех, кто столкнулся с той же ошибкой и пришел сюда из поисковых систем, убедитесь, что TransportClient использует то же имя кластера, что и сам кластер.

  1. Проверьте имя кластера.

Посетите http://localhost:9200, чтобы проверить имя кластера. Имя по умолчанию — elasticsearch. Если вы настроили имя кластера с помощью файла elasticsearch.yml, убедитесь, что файл конфигурации выбран.

  1. Установите culster.name при создании TransportClient.

    Settings settings = ImmutableSettings.settingsBuilder()
            .put("cluster.name", clusterName)
            .put("client.transport.ignore_cluster_name", false)
            .put("node.client", true)
            .put("client.transport.sniff", true)
            .build();
    client = new TransportClient(settings).addTransportAddress(new  InetSocketTransportAddress(host, port)); 
    
  2. Игнорировать проверку имени кластера

Вы можете игнорировать проверку имени кластера, установив client.transport.ignore_cluster_name на true.

  1. Отладка, если ошибка все еще существует

Если ошибка все еще существует, запустите приложение в режиме отладки и отладьте TransportClientNodesService.

person Alex Cheng    schedule 30.06.2015
comment
В большинстве случаев эта ошибка возникает только тогда, когда транспортный клиент имеет неправильное имя кластера! - person Selvakumar Esra; 19.05.2016
comment
Я просто отключил проверку имени кластера на данный момент. Благодарю вас! - person Dmitry Minkovsky; 24.06.2017

Я изменил имя на своем сервере dev elasticsearch ради экспериментов и забыл об этом.

Сообщение об ошибке на клиенте было не очень полезным, TransportClientNodeService сравнивает с удаленным именем, но фактически не записывает удаленное имя («имя-кластера») в журнал.

Можно обойти проверку имени со следующей конфигурацией Spring:

Решение для меня было либо:

  • Измените имя cluster.name на сервере elasticsearch.
  • Игнорировать имя кластера клиента.

Я выбрал оба, это моя конфигурация Spring, надеюсь, это поможет:

spring:
    ...
    data:
    elasticsearch:
        # Defaults to cluster-name 'elasticsearch'
        cluster-name:
        cluster-nodes: 127.0.0.1:9300
        properties:
            # https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html
            client.transport.ignore_cluster_name: true
person hirro    schedule 10.01.2016