searchresponse query example español ejemplo java elasticsearch

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)