web-dev-qa-db-ja.com

Elasticsearchのインデックス作成が機能せず、エラーメッセージ:ノードnullがクラスタークラスターの一部ではありません[elasticsearch]、無視します

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"
}

そして、私は春のデータを使用してそれにアクセスしようとしています。 xml名前空間を使用してアプリケーションコンテキストに次の行を追加しました(Springデータのドキュメントによる)。

<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 

誰かがこれで私を助けることができますか?

16
Sunny Agarwal

同じエラーが発生し、検索エンジンからここに来た人は、TransportClientがクラスター自体と同じクラスター名を使用していることを確認してください。

  1. クラスター名を確認してください。

http:// localhost:92 にアクセスして、クラスター名を確認してください。デフォルト名はelasticsearchです。 elasticsearch.ymlファイルを使用してクラスター名をカスタマイズした場合は、構成ファイルが選択されていることを確認してください。

  1. TransportClientを作成するときにculster.nameを設定します。

    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_nametrueに設定すると、クラスター名のチェックを無視できます。

  1. エラーがまだ存在する場合はデバッグします

それでもエラーが発生する場合は、アプリケーションをデバッグモードで起動し、デバッグ TransportClientNodesService

38
Alex Cheng

実験のために開発用elasticsearchサーバーの名前を変更しましたが、忘れてしまいました。

クライアントのエラーメッセージはそれほど役に立ちませんでした。TransportClientNodeServiceはリモート名と比較しますが、実際にはリモート名( "cluster-name")をログに書き込みません。

次のSpring構成では、名前チェックをバイパスすることができます。

私の解決策は次のいずれかでした。

  • Elasticsearchサーバーでcluster.nameの名前を変更します。
  • クライアントのクラスター名を無視します。

私は両方に行きました、これは私の春の設定です、それが役立つことを願っています:

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
4
hirro