2013-05-21 1 views
24

Ho problemi a connettersi al cluster vanilla ElasticSearch tramite l'API Java.Perché non riesco a connettermi a ElasticSearch tramite l'API Java?

di riprodursi:

#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"\ 
}' 

risultato:

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

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

risultato:

{ 
    "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" 
     } 
     } 
    ] 
    } 
} 

Quindi, tutto funziona via HTTP. Cercando tramite Java (per this 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); 
} 

E ottengo il seguente stack trace:

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) 

E cosa più vicina che ho trovato finora a questo problema è here, ma il filo si spense senza risoluzione.

+0

sto ottenendo il seguente errore durante l'utilizzo di ricerca elastico può aiutare Eccezione @jnBrymn in thread "main" java.lang.VerifyError:. Classe org.elasticsearch.transport.Netty3Plugin sovrascrive ultimo metodo onModule (Lorg/elasticsearch/common/network/NetworkModule;) V –

risposta

67

La porta predefinita di TransportClient è 9300. È necessario utilizzarla al posto di 9200 nel codice Java. Questo è probabilmente il motivo per cui la connessione fallisce.

+1

E ... l'ha fatto! L'esempio elasticsearch ha 9300. Dovrebbero cambiare ciò che immagino. – JnBrymn

+0

@JohnBerryman a quale esempio ti riferisci? – javanna

+0

Sono apparentemente molto confuso. Ho controllato quell'esempio e in effetti è 9200. Allora ... l'ho immaginato! – JnBrymn

0
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

per favore spiega o aggiungi alcuni commenti al tuo codice, sarà più utile per gli studenti. – HDJEMAI