2013-05-21 11 views
24

Mam problemy z połączeniem się z klastrem wanilii ElasticSearch za pośrednictwem interfejsu API języka Java.Dlaczego nie mogę połączyć się z ElasticSearch za pomocą interfejsu API języka Java?

Aby odtworzyć:

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

Wynik:

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

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

Wynik:

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

Więc wszystko działa przez HTTP. Próbuje poprzez Java (za 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); 
} 

I otrzymuję następujący ślad stosu:

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) 

A najbliżej rzeczą znalazłem do tej pory na ten problem jest here, ale wątek urwał bez rozdzielczości.

+0

otrzymuję następujący błąd podczas korzystania z elastycznego wyszukiwania można pomóc @jnBrymn Wyjątek w wątku „main” java.lang.VerifyError. Klasa org.elasticsearch.transport.Netty3Plugin nadpisuje metodę ostateczną onModule (Lorg/elasticsearch/common/network/NetworkModule;) V –

Odpowiedz

67

Port domyślny TransportClient to 9300. Musisz użyć go zamiast 9200 w kodzie Java. Prawdopodobnie dlatego połączenie nie powiedzie się.

+1

I ... to się udało! Przykład elastycznego wyszukiwania ma wartość 9300. Powinni to zmienić. – JnBrymn

+0

@JohnBerryman jaki przykład masz na myśli? – javanna

+0

Jestem najwyraźniej bardzo zdezorientowany. Sprawdziłem na tym przykładzie i rzeczywiście jest 9200. Więc ... Wyobraziłem to! – 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

proszę wyjaśnić lub dodać kilka komentarzy do kodu, będzie to bardziej pomocne dla uczniów. – HDJEMAI

Powiązane problemy