Once a GClient has been obtained, all of ElasticSearch APIs can be executed on it. Each Groovy API is exposed using three different mechanisms.
Closure Request
The first type is to simply provide the request as a Closure, which automatically gets resolved into the respective request instance (for the index API, its the IndexRequest
class). The API returns a special future, called GActionFuture
. This is a groovier version of elasticsearch Java ActionFuture
(in turn a nicer extension to Java own Future
) which allows to register listeners (closures) on it for success and failures, as well as blocking for the response. For example:
def indexR = client.index { index "test" type "type1" id "1" source { test = "value" complex { value1 = "value1" value2 = "value2" } } } println "Indexed $indexR.response.id into $indexR.response.index/$indexR.response.type"
In the above example, calling indexR.response
will simply block for the response. We can also block for the response for a specific timeout:
IndexResponse response = indexR.response "5s" // block for 5 seconds, same as: response = indexR.response 5, TimeValue.SECONDS //
We can also register closures that will be called on success and on failure:
indexR.success = {IndexResponse response -> pritnln "Indexed $response.id into $response.index/$response.type" } indexR.failure = {Throwable t -> println "Failed to index: $t.message" }
Request
This option allows to pass the actual instance of the request (instead of a closure) as a parameter. The rest is similar to the closure as a parameter option (the GActionFuture
handling). For example:
def indexR = client.index (new IndexRequest( index: "test", type: "type1", id: "1", source: { test = "value" complex { value1 = "value1" value2 = "value2" } })) println "Indexed $indexR.response.id into $indexR.response.index/$indexR.response.type"
Java Like
The last option is to provide an actual instance of the API request, and an ActionListener
for the callback. This is exactly like the Java API with the added gexecute
which returns the GActionFuture
:
def indexR = node.client.prepareIndex("test", "type1", "1").setSource({ test = "value" complex { value1 = "value1" value2 = "value2" } }).gexecute()