OpenSearch/docs/java-api/client.asciidoc

197 lines
7.0 KiB
Plaintext
Raw Normal View History

[[client]]
== Client
You can use the *Java client* in multiple ways:
[doc] Reorganize and clean Java documentation This commit reorganizes the docs to make Java API docs looking more like the REST docs. Also, with 2.0.0, FilterBuilders don't exist anymore but only QueryBuilders. Also, all docs api move now to docs/java-api/docs dir as for REST doc. Remove removed queries/filters ----- * Remove Constant Score Query with filter * Remove Fuzzy Like This (Field) Query (flt and flt_field) * Remove FilterBuilders Move filters to queries ----- * Move And Filter to And Query * Move Bool Filter to Bool Query * Move Exists Filter to Exists Query * Move Geo Bounding Box Filter to Geo Bounding Box Query * Move Geo Distance Filter to Geo Distance Query * Move Geo Distance Range Filter to Geo Distance Range Query * Move Geo Polygon Filter to Geo Polygon Query * Move Geo Shape Filter to Geo Shape Query * Move Has Child Filter by Has Child Query * Move Has Parent Filter by Has Parent Query * Move Ids Filter by Ids Query * Move Limit Filter to Limit Query * Move MatchAll Filter to MatchAll Query * Move Missing Filter to Missing Query * Move Nested Filter to Nested Query * Move Not Filter to Not Query * Move Or Filter to Or Query * Move Range Filter to Range Query * Move Ids Filter to Ids Query * Move Term Filter to Term Query * Move Terms Filter to Terms Query * Move Type Filter to Type Query Add missing queries ----- * Add Common Terms Query * Add Filtered Query * Add Function Score Query * Add Geohash Cell Query * Add Regexp Query * Add Script Query * Add Simple Query String Query * Add Span Containing Query * Add Span Multi Term Query * Add Span Within Query Reorganize the documentation ----- * Organize by full text queries * Organize by term level queries * Organize by compound queries * Organize by joining queries * Organize by geo queries * Organize by specialized queries * Organize by span queries * Move Boosting Query * Move DisMax Query * Move Fuzzy Query * Move Indices Query * Move Match Query * Move Mlt Query * Move Multi Match Query * Move Prefix Query * Move Query String Query * Move Span First Query * Move Span Near Query * Move Span Not Query * Move Span Or Query * Move Span Term Query * Move Template Query * Move Wildcard Query Add some missing pages ---- * Add multi get API * Add indexed-scripts link Also closes #7826 Related to https://github.com/elastic/elasticsearch/pull/11477#issuecomment-114745934
2015-06-24 17:27:19 -04:00
* Perform standard <<java-docs-index,index>>, <<java-docs-get,get>>,
<<java-docs-delete,delete>> and <<java-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 tests
Obtaining an elasticsearch `Client` is simple. The most common way to
get a client is by:
1. Creating an embedded <<node-client,`Node`>> that acts as a node
within 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 client
and cluster sides. You may hit some incompatibility issues when mixing
major versions.
______________________________________________________________________________________________________________________________________________________________
[[node-client]]
=== Node Client
Instantiating a node based client is the simplest way to get a `Client`
that can execute operations against elasticsearch.
[source,java]
--------------------------------------------------
// on startup
Node node = new Node(Settings.EMPTY).start();
Client client = node.client();
// on shutdown
node.close();
--------------------------------------------------
When you start a `Node`, it joins an elasticsearch cluster. You can have
different clusters by simply setting the `cluster.name` setting, or
explicitly 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 the
classpath, 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 are
automatically routed to the node(s) the operations need to be executed
on, without performing a "double hop". For example, the index operation
will automatically be executed on the shard that it will end up existing
at.
When you start a `Node`, the most important decision is whether it
should hold data or not. In other words, should indices and shards be
allocated to it. Many times we would like to have the clients just be
clients, without shards being allocated to them. This is simple to
configure by setting either `node.data` setting to `false` or
`node.client` to `true` (the `NodeBuilder` respective helper methods on
it):
[source,java]
--------------------------------------------------
// on startup
// Embedded node clients behave just like standalone nodes,
// which means that they will leave the HTTP port open!
Node node = new Node(Settings.settingsBuilder()
.put("http.enabled", false)
.put("node.client", true).build())
.start();
Client client = node.client();
// on shutdown
node.close();
--------------------------------------------------
Another common usage is to start the `Node` and use the `Client` in
unit/integration tests. In such a case, we would like to start a "local"
`Node` (with a "local" discovery and transport). Again, this is just a
matter of a simple setting when starting the `Node`. Note, "local" here
means local on the JVM (well, actually class loader) level, meaning that
two *local* servers started within the same JVM will discover themselves
and form a cluster.
[source,java]
--------------------------------------------------
// on startup
Node node = new Node(Settings.builder().put("node.local", true).build()).start();
Client client = node.client();
// on shutdown
node.close();
--------------------------------------------------
[[node-client-downsides]]
==== Node Client Downsides
Embedding a node client into your application is the easiest way to connect
to an Elasticsearch cluster, but it carries some downsides.
- Frequently starting and stopping one or more node clients creates unnecessary
noise across the cluster.
- Embedded node client will respond to outside requests, just like any other client.
** You almost always want to disable HTTP for an _embedded_ node client.
[[transport-client]]
=== Transport Client
The `TransportClient` connects remotely to an Elasticsearch cluster
using the transport module. It does not join the cluster, but simply
gets one or more initial transport addresses and communicates with them
in round robin fashion on each action (though most actions will probably
be "two hop" operations).
[source,java]
--------------------------------------------------
// on startup
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
// on shutdown
client.close();
--------------------------------------------------
Note that you have to set the cluster name if you use one different than
"elasticsearch":
[source,java]
--------------------------------------------------
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "myClusterName").build();
Client client = TransportClient.builder().settings(settings).build();
//Add transport addresses and do something with the client...
--------------------------------------------------
The client allows sniffing the rest of the cluster, which adds data nodes
into its list of machines to use. In this case, note that the IP addresses
used 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 = Settings.settingsBuilder()
.put("client.transport.sniff", true).build();
TransportClient client = TransportClient.builder().settings(settings).build();
--------------------------------------------------
Other transport client level settings include:
[cols="<,<",options="header",]
|=======================================================================
|Parameter |Description
|`client.transport.ignore_cluster_name` |Set to `true` to ignore cluster
name validation of connected nodes. (since 0.19.4)
|`client.transport.ping_timeout` |The time to wait for a ping response
from a node. Defaults to `5s`.
|`client.transport.nodes_sampler_interval` |How often to sample / ping
the nodes listed and connected. Defaults to `5s`.
|=======================================================================