| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 | [[client]]== ClientYou can use the *Java client* in multiple ways:* Perform standard <<index_,index>>, <<get,get>>,  <<delete,delete>> and <<search,search>> operations on an  existing cluster* Perform administrative tasks on a running cluster* Start full nodes when you want to run Elasticsearch embedded in your  own application  or when you want to launch unit or integration testsObtaining an elasticsearch `Client` is simple. The most common way toget a client is by:1.  Creating an embedded <<node-client,`Node`>> that acts as a nodewithin a cluster.2.  Requesting a `Client` from your embedded `Node`.Another manner is by creating a <<transport-client,`TransportClient`>>that connects to a cluster.*Important:*______________________________________________________________________________________________________________________________________________________________Please note that you are encouraged to use the same version on clientand cluster sides. You may hit some incompatibility issues when mixingmajor versions.______________________________________________________________________________________________________________________________________________________________[[node-client]]=== Node ClientInstantiating a node based client is the simplest way to get a `Client`that can execute operations against elasticsearch.[source,java]--------------------------------------------------import static org.elasticsearch.node.NodeBuilder.*;// on startupNode node = nodeBuilder().node();Client client = node.client();// on shutdownnode.close();--------------------------------------------------When you start a `Node`, it joins an elasticsearch cluster. You can havedifferent clusters by simply setting the `cluster.name` setting, orexplicitly using the `clusterName` method on the builder.You can define `cluster.name` in the `/src/main/resources/elasticsearch.yml`file in your project. As long as `elasticsearch.yml` is present in theclasspath, it will be used when you start your node.[source,yaml]--------------------------------------------------cluster.name: yourclustername--------------------------------------------------Or in Java:[source,java]--------------------------------------------------Node node = nodeBuilder().clusterName("yourclustername").node();Client client = node.client();--------------------------------------------------The benefit of using the `Client` is the fact that operations areautomatically routed to the node(s) the operations need to be executedon, without performing a "double hop". For example, the index operationwill automatically be executed on the shard that it will end up existingat.When you start a `Node`, the most important decision is whether itshould hold data or not. In other words, should indices and shards beallocated to it. Many times we would like to have the clients just beclients, without shards being allocated to them. This is simple toconfigure by setting either `node.data` setting to `false` or`node.client` to `true` (the `NodeBuilder` respective helper methods onit):[source,java]--------------------------------------------------import static org.elasticsearch.node.NodeBuilder.*;// on startupNode node = nodeBuilder().client(true).node();Client client = node.client();// on shutdownnode.close();--------------------------------------------------Another common usage is to start the `Node` and use the `Client` inunit/integration tests. In such a case, we would like to start a "local"`Node` (with a "local" discovery and transport). Again, this is just amatter of a simple setting when starting the `Node`. Note, "local" heremeans local on the JVM (well, actually class loader) level, meaning thattwo *local* servers started within the same JVM will discover themselvesand form a cluster.[source,java]--------------------------------------------------import static org.elasticsearch.node.NodeBuilder.*;// on startupNode node = nodeBuilder().local(true).node();Client client = node.client();// on shutdownnode.close();--------------------------------------------------[[transport-client]]=== Transport ClientThe `TransportClient` connects remotely to an elasticsearch clusterusing the transport module. It does not join the cluster, but simplygets one or more initial transport addresses and communicates with themin round robin fashion on each action (though most actions will probablybe "two hop" operations).[source,java]--------------------------------------------------// on startupClient client = new TransportClient()        .addTransportAddress(new InetSocketTransportAddress("host1", 9300))        .addTransportAddress(new InetSocketTransportAddress("host2", 9300));// on shutdownclient.close();--------------------------------------------------Note that you have to set the cluster name if you use one different than"elasticsearch":[source,java]--------------------------------------------------Settings settings = ImmutableSettings.settingsBuilder()        .put("cluster.name", "myClusterName").build();Client client =    new TransportClient(settings);//Add transport addresses and do something with the client...--------------------------------------------------Or using `elasticsearch.yml` file as shown in <<node-client>>The client allows sniffing the rest of the cluster, which adds data nodesinto its list of machines to use. In this case, note that the IP addressesused will be the ones that the other nodes were started with (the"publish" address). In order to enable it, set the`client.transport.sniff` to `true`:[source,java]--------------------------------------------------Settings settings = ImmutableSettings.settingsBuilder()        .put("client.transport.sniff", true).build();TransportClient client = new TransportClient(settings);--------------------------------------------------Other transport client level settings include:[cols="<,<",options="header",]|=======================================================================|Parameter |Description|`client.transport.ignore_cluster_name` |Set to `true` to ignore clustername validation of connected nodes. (since 0.19.4)|`client.transport.ping_timeout` |The time to wait for a ping responsefrom a node. Defaults to `5s`.|`client.transport.nodes_sampler_interval` |How often to sample / pingthe nodes listed and connected. Defaults to `5s`.|=======================================================================
 |