public static void main(String[] args) throws IOException {
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", "foxzen")
.put("node.name", "yu").build();
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("XXX.XXX.XXX.XXX", 9200));
// XXX is my server's ip address
IndexResponse response = client.prepareIndex("Twitter", "Tweet")
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("productId", "1")
.field("productName", "XXX").endObject()).execute().actionGet();
System.out.println(response.getIndex());
System.out.println(response.getType());
System.out.println(response.getVersion());
client.close();
}
コンピューターからサーバーにアクセスします
curl -get http://XXX.XXX.XXX.XXX:9200/
これを取れ
{
"status" : 200,
"name" : "yu",
"version" : {
"number" : "1.1.0",
"build_hash" : "2181e113dea80b4a9e31e58e9686658a2d46e363",
"build_timestamp" : "2014-03-25T15:59:51Z",
"build_snapshot" : false,
"lucene_version" : "4.7"
},
"tagline" : "You Know, for Search"
}
Java APIを使用してエラーが発生するのはなぜですか?
[〜#〜] edit [〜#〜]
elasticsearch.yml
のクラスターとノード部分の構成があります
################################### Cluster ###################################
# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
cluster.name: foxzen
#################################### Node #####################################
# Node names are generated dynamically on startup, so you're relieved
# from configuring them manually. You can tie this node to a specific name:
#
node.name: yu
いくつかの提案:
1-ポート9300を使用します。[9300-9400]はノード間通信用、[9200-9300]はHTTPトラフィック用です。
2-使用しているJava APIのバージョンが、サーバーで実行されているelasticsearchのバージョンと一致することを確認します。
3-クラスターの名前がfoxzen
であることを確認します(サーバー上のelasticsearch.ymlを確認します)。
4-put("node.name", "yu")
を削除します。TransportClient
を使用しているため、クラスターとしてノードに参加していません。サーバーノードの名前がyu
であるように見えてもいずれにしても、異なるノード名が必要になります。
ポート9300を使用するには、コードを変更する必要があります。正しい行は次のとおりです。
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("XXX.XXX.XXX.XXX", 9300));
理由は、Java APIはノード間通信に使用される内部トランスポートを使用しており、デフォルトはポート9300であるためです。ポート9200はREST APIインターフェース:よくある問題-トランスポートクライアントの下のページの下部にあるこのサンプルコードを確認してください。
http://www.elasticsearch.org/guide/en/elasticsearch/client/Java-api/current/client.html
// on startup
Client client = new TransportClient()
.addTransportAddress(new InetSocketTransportAddress("Host1", 9300))
.addTransportAddress(new InetSocketTransportAddress("Host2", 9300));
// on shutdown
client.close();
私もこのエラーに遭遇しました。私は、DockerでElasticSearch 2.4.1をスタンドアロンサーバー(単一ノード)として使用し、Grails 3/spring-data-elasticsearchでプログラミングします。私の修正はclient.transport.sniff
からfalse
へ。ここに私のコアconfがあります:
application.yml
spring.data.elasticsearch:
cluster-name: "my-es"
cluster-nodes: "localhost:9300"
properties:
"client.transport.ignore_cluster_name": true
"client.transport.nodes_sampler_interval": "5s"
"client.transport.ping_timeout": "5s"
"client.transport.sniff": false # XXX : notice here
repositories.enabled: false
this を参照してください
ESサーバーをリモートホストに設定していると思いますか?その場合、公開アドレスをホストのパブリックIPアドレスにバインドする必要があります。
ESホストで/etc/elasticsearch/elasticsearch.yml
およびnetwork.publish_Hostの後にパブリックIPを追加します。
# Set the address other nodes will use to communicate with this node. If not
# set, it is automatically derived. It must point to an actual IP address.
#
network.publish_Host: 192.168.0.1
そして、コードでポート9300でこのホストに接続します。ドメイン名ではなくIPが必要であることに注意してください(少なくともAmazon EC2での私の経験によると)
ポート9300を使用している場合でも問題が解決せず、他のすべてが正しく構成されているようであれば、古いバージョンのelasticsearchを使用してみてください。
Elasticsearchバージョン2.2.0を使用しているときに同じエラーが発生していましたが、バージョン1.7.5にロールバックするとすぐに、私の問題は魔法のように消えました。この問題を抱えている他の人へのリンクは次のとおりです。 古いバージョンが問題を解決します
他の理由として、Elasticsearch Java clientはElasticsearchサーバーとは異なるバージョンです。
Elasticsearch Javaクライアントバージョンは、コードベースのelasticsearchjarバージョンに他なりません。
例:私のコードではelasticsearch-2.4.0.jar
Elasticsearchサーバーのバージョンを確認するには、
$ /Users/kkolipaka/elasticsearch/bin/elasticsearch -version
Version: 5.2.2, Build: f9d9b74/2017-02-24T17:26:45.835Z, JVM: 1.8.0_111
ご覧のとおり、Elastic server 5.2.2の最新バージョンをダウンロードしましたが、ES Java APIクライアントバージョン2.4.0 https://www.elastic .co/guide/en/elasticsearch/client/Java-api/current/client.html
TransportClient
ビルダーでcluster.name
を設定していなかったため、同様の問題を抱えている人のためにこれを受け取りました。プロパティを追加し、すべてが機能しました。
別の解決策は、プロジェクトの依存関係に_io.netty.netty-all
_を明示的に含めることです。
addTransportAddresses
でメソッドnodesSampler.sample()
が実行され、追加されたアドレスの可用性が確認されています。私の場合、メソッドio.netty.channel.DefaultChannelId.newInstance()
が見つからないため、_try-catch
_ブロックはConnectTransportException
を飲み込みます。したがって、追加されたノードは使用可能として扱われません。