query - search request elasticsearch java
ElasticSearch Java API: NoNodeAvailableException: No hay ningún nodo disponible (8)
Algunas sugerencias:
1 - Use el puerto 9300. [9300-9400] es para la comunicación de nodo a nodo, [9200-9300] es para el tráfico HTTP.
2 - Asegúrese de que la versión de la API de Java que está utilizando coincida con la versión de elasticsearch que se ejecuta en el servidor.
3 - Asegúrese de que el nombre de su clúster sea foxzen
(consulte el foxzen
en el servidor).
4 - Eliminar put("node.name", "yu")
, no se está uniendo al clúster como un nodo ya que está usando TransportClient
, e incluso si lo estuviera, su nodo de servidor se llama yu
así que querría un nombre de nodo diferente en cualquier caso.
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();
}
Accedo al servidor desde mi computadora
curl -get http://XXX.XXX.XXX.XXX:9200/
toma esto
{
"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"
}
¿Por qué obtener un error al usar la API de Java?
EDITAR
Existe la configuración de parte del clúster y nodo de 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
Me encontré con este error también. Uso ElasticSearch 2.4.1 como un servidor independiente (nodo único) en la ventana acoplable, programando con Grails 3 / spring-data-elasticsearch. Mi solución es establecer client.transport.sniff
en false
. Aquí está mi conf núcleo:
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
Mira this
Necesita cambiar su código para usar el puerto 9300 - la línea correcta sería:
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("XXX.XXX.XXX.XXX", 9300));
La razón es que la API de Java está utilizando el transporte interno utilizado para las comunicaciones entre nodos y su valor predeterminado es el puerto 9300. El puerto 9200 es el predeterminado para la interfaz API REST. Problema común al encontrarlo: compruebe este código de ejemplo aquí en la parte inferior de la página, en Transport Client:
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();
Otra razón podría ser que su cliente Elasticsearch Java es una versión diferente de su servidor Elasticsearch .
La versión del cliente de Elasticsearch Java no es más que su versión del jar de elasticsearch en su base de código.
Por ejemplo: en mi código es elasticsearch-2.4.0.jar
Para verificar la versión del servidor Elasticsearch,
$ /Users/kkolipaka/elasticsearch/bin/elasticsearch -version
Version: 5.2.2, Build: f9d9b74/2017-02-24T17:26:45.835Z, JVM: 1.8.0_111
Como puede ver, he descargado la versión más reciente de Elastic Server 5.2.2 pero me olvidé de actualizar el cliente de la API de Java ES versión 2.4.0 https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/client.html
Otra solución puede ser incluir io.netty.netty-all
en las dependencias del proyecto de forma explícita.
En addTransportAddresses
se está ejecutando un método nodesSampler.sample()
y se está comprobando la disponibilidad de direcciones allí. En mi caso try-catch
bloque try-catch
se traga ConnectTransportException
porque no se puede encontrar un método io.netty.channel.DefaultChannelId.newInstance()
. Entonces, el nodo agregado simplemente no se trata como disponible.
Para personas con problemas similares, recibí esto porque no había configurado cluster.name
en el constructor TransportClient
. Se agregó la propiedad y todo funcionó.
Si todavía tiene problemas, incluso cuando usa el puerto 9300, y todo lo demás parece estar configurado correctamente, intente utilizar una versión anterior de elasticsearch.
Estaba obteniendo el mismo error al usar elasticsearch versión 2.2.0, pero tan pronto como volví a la versión 1.7.5, mi problema desapareció por arte de magia. Aquí hay un enlace a otra persona que tiene este problema: la versión anterior resuelve el problema
Supongo que está configurando el servidor ES en un host remoto. En ese caso, deberá vincular la dirección de publicación a la dirección IP pública del host.
En su host de ES, edite /etc/elasticsearch/elasticsearch.yml
y agregue su IP pública después de network.publish_host:
# 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
Y en su código, conéctese a este host en el puerto 9300. Tenga en cuenta que necesita la dirección IP y no el nombre de dominio (al menos según mi experiencia en Amazon EC2)