25

I'm having trouble connecting to vanilla ElasticSearch cluster via the Java API.

To reproduce:

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

result:

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

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

result:

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

So, everything works via HTTP. Trying via 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);
}

And I get the following 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)

And closest thing I've found so far to this problem is here, but the thread trailed off without resolution.

1
  • I am getting the following error while using elastic search can you help @jnBrymn Exception in thread "main" java.lang.VerifyError: class org.elasticsearch.transport.Netty3Plugin overrides final method onModule.(Lorg/elasticsearch/common/network/NetworkModule;)V Commented May 23, 2017 at 11:27

2 Answers 2

73

The TransportClient default port is 9300. You have to use it instead of 9200 in your Java code. This is probably why the connection fails.

Sign up to request clarification or add additional context in comments.

3 Comments

And... that did it! The elasticsearch example has 9300. They should change that I guess.
I'm apparently very confused. I checked back at that example and indeed it's 9200. So... I imagined it!
updated: elasticsearch.org/guide/reference/java-api/client the TransportClient example, uses the 9300 port
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(); 
        } 
    } 

1 Comment

please explain or add some comments to your code, it will be more helpful for learners.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.