Pourquoi ne puis-je pas me connecter à ElasticSearch via L'API Java?

J'ai du mal à me connecter au cluster vanilla ElasticSearch via L'API Java.

Pour reproduire:

#start elasticsearch
elasticsearch -f

#checking in a new window
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

Résultat:

{
  "ok": true,
  "_index": "twitter",
  "_type": "tweet",
  "_id": "1",
  "_version": 3
}

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'

Résultat:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.30685282,
    "hits": [
      {
        "_index": "twitter",
        "_type": "tweet",
        "_id": "1",
        "_score": 0.30685282,
        "_source": {
          "user": "kimchy",
          "post_date": "2009-11-15T14:12:12",
          "message": "trying out Elastic Search"
        }
      }
    ]
  }
}

Donc, tout fonctionne via HTTP. Essayer via Java (par cette page):

public static void main(String[] args) {

    Client client = new TransportClient()
    .addTransportAddress(new InetSocketTransportAddress("localhost", 9200));

    IndexResponse response = null;
    try {
      response = client.prepareIndex("twitter", "tweet", "1")
          .setSource(XContentFactory.jsonBuilder()
                      .startObject()
                          .field("user", "john")
                          .field("postDate", new Date())
                          .field("message", "who dont it work")
                      .endObject()
                    )
          .execute()
          .actionGet();
    } catch (ElasticSearchException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    System.out.println(response);
}

Et j'obtiens la trace de pile suivante:

May 21, 2013 8:27:42 AM org.elasticsearch.plugins
INFO: [Bes] loaded [], sites []
May 21, 2013 8:27:49 AM org.elasticsearch.client.transport
INFO: [Bes] failed to get node info for [#transport#-1][inet[localhost/127.0.0.1:9200]], disconnecting...
org.elasticsearch.transport.ReceiveTimeoutTransportException: [][inet[localhost/127.0.0.1:9200]][cluster/nodes/info] request_id [0] timed out after [5002ms]
    at org.elasticsearch.transport.TransportService$TimeoutHandler.run(TransportService.java:342)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:680)
Exception in thread "main" org.elasticsearch.client.transport.NoNodeAvailableException: No node available
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:202)
    at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.java:106)
    at org.elasticsearch.client.support.AbstractClient.index(AbstractClient.java:84)
    at org.elasticsearch.client.transport.TransportClient.index(TransportClient.java:310)
    at org.elasticsearch.action.index.IndexRequestBuilder.doExecute(IndexRequestBuilder.java:315)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:62)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:57)
    at Scratch.main(Scratch.java:30)

Et la chose la plus proche que j'ai trouvée jusqu'à présent à ce problème est ici , mais le thread s'est arrêté sans résolution.

25
demandé sur Saeed Zhiany 2013-05-21 16:38:27

2 réponses

Le port par défaut de TransportClient est 9300. Vous devez l'utiliser au lieu de 9200 dans votre code Java. C'est probablement pourquoi la connexion échoue.

70
répondu mguillermin 2013-05-21 12:58:07
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;


public class ElasticsearchTest {  
    public static void main(String[] argv) throws UnknownHostException{ 

        /* //Set new cluester
        Settings settings = Settings.builder()
                .put("cluster.name", "newCluster")
                .put("node.name","newNode").build();*/

        //create cliet !!!Make sure keep settings empty if your cluster is the 
        //same as the one you defined in your elasticsearch.yml file
        //Plus, port here(9300)must be different from your http port(9200)

        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //get data
        GetResponse response = client.prepareGet("twitter", "tweet", "1").execute().actionGet();

       //output
        System.out.println(response.getSourceAsString());

        client.close(); 
        } 
    } 
0
répondu Eli Zheng 2017-04-26 03:52:14