Elasticsearch TransportClient 连接 [Java]
Elasticsearch TransportClient connection [Java]
我正在使用 Maven 在 Java 项目 中使用 Elasticsearch:
...
<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)
}
elasticsearch.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里面的其他信息有注释)
localhost: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"
}
问题出在您的端口配置上,您正在使用端口 9300
进行 REST 调用,而该端口实际上用于 elasticsearch 集群中的 inter-nodes 通信。请更改以下 java 代码以使用端口 9200
.
address = new TransportAddress(InetAddress.getByName("localhost"), 9200);
请阅读有关 es 端口的更多信息 https://discuss.elastic.co/t/elasticsearch-port-9200-or-9300/72080/2
我解决了这个问题。问题是我使用的是带有 TransportClient 的 Elasticsearch 6.7.0 版本,它已被弃用并被 RestHighLevelClient 取代。另外,我不得不使用端口 9200 并取消注释 http.port: 9200 和 discovery.seed_hosts: ["host1", "host2"] from elasticsearch.yaml
我正在使用 Maven 在 Java 项目 中使用 Elasticsearch:
...
<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)
}
elasticsearch.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里面的其他信息有注释)
localhost: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"
}
问题出在您的端口配置上,您正在使用端口 9300
进行 REST 调用,而该端口实际上用于 elasticsearch 集群中的 inter-nodes 通信。请更改以下 java 代码以使用端口 9200
.
address = new TransportAddress(InetAddress.getByName("localhost"), 9200);
请阅读有关 es 端口的更多信息 https://discuss.elastic.co/t/elasticsearch-port-9200-or-9300/72080/2
我解决了这个问题。问题是我使用的是带有 TransportClient 的 Elasticsearch 6.7.0 版本,它已被弃用并被 RestHighLevelClient 取代。另外,我不得不使用端口 9200 并取消注释 http.port: 9200 和 discovery.seed_hosts: ["host1", "host2"] from elasticsearch.yaml