2013-05-21 3 views
24

자바 API를 통해 바닐라 ElasticSearch 클러스터에 연결하는 데 문제가 있습니다.Java API를 통해 ElasticSearch에 연결할 수없는 이유는 무엇입니까?

재현하려면

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

결과 :

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

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

결과 : 그래서

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

, 모든 것을 HTTP를 통해 작동합니다.

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); 
} 

그리고 나는 다음과 같은 스택 추적 얻을 : (this page 당) 자바를 통해 시도 내가 지금까지이 문제가 here되는 것으로 나타났습니다

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) 

그리고 가까운 일을하지만, 스레드는 오프 차지했다 해결하지 않고.

+0

나는 다음과 같은 오류를 얻고있다 "기본"java.lang.VerifyError가 : 클래스입니다. org.elasticsearch.transport.Netty3Plugin는 마지막 방법 onModule을 무시 (LORG/elasticsearch/common/network/NetworkModule;) V –

답변

67

TransportClient 기본 포트는 9300입니다. Java 코드에서 9200 대신이 포트 번호를 사용해야합니다. 이것은 아마도 연결이 실패하는 이유 일 것입니다. 탄성 검색을 사용하면 당신이 스레드에서 @jnBrymn 예외 도움을 줄 수있는 동안

+1

그리고 ... 그랬어! elasticsearch 예제는 9300입니다. 그들은 내가 추측하는 바꿔야합니다. – JnBrymn

+0

@ JohnBerryman 당신은 어떤 예를 들겠습니까? – javanna

+0

나는 분명히 매우 혼란 스럽다. 그 예제를 다시 확인했는데 실제로 9200입니다. 그래서 ... 상상했습니다! – 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

을 사용하여 코드에 설명을 추가하거나 학습자에게 도움이됩니다. – HDJEMAI

관련 문제