[[search]]
== Search API

The search API is very similar to the
link:{java}/search.html[Java search API]. The Groovy
extension allows to provide the search source to execute as a `Closure`
including the query itself (similar to GORM criteria builder):

[source,js]
--------------------------------------------------
def search = node.client.search {
    indices "test"
    types "type1"
    source {
        query {
            term(test: "value")
        }
    }
}

search.response.hits.each {SearchHit hit -> 
    println "Got hit $hit.id from $hit.index/$hit.type"
}
--------------------------------------------------

It can also be executed using the "Java API" while still using a closure
for the query:

[source,js]
--------------------------------------------------
def search = node.client.prepareSearch("test").setQuery({
        term(test: "value")
}).gexecute();

search.response.hits.each {SearchHit hit -> 
    println "Got hit $hit.id from $hit.index/$hit.type"
}
--------------------------------------------------

The format of the search `Closure` follows the same JSON syntax as the
link:{ref}/search-search.html[Search API] request.

[float]
=== More examples

Term query where multiple values are provided (see
link:{ref}/query-dsl-terms-query.html[terms]):

[source,js]
--------------------------------------------------
def search = node.client.search {
    indices "test"
    types "type1"
    source {
        query {
            terms(test: ["value1", "value2"])
        }
    }
}
--------------------------------------------------

Query string (see
link:{ref}/query-dsl-query-string-query.html[query string]):

[source,js]
--------------------------------------------------
def search = node.client.search {
    indices "test"
    types "type1"
    source {
        query {
            query_string(
                fields: ["test"],
                query: "value1 value2")
        }
    }
}
--------------------------------------------------

Pagination (see
link:{ref}/search-request-from-size.html[from/size]):

[source,js]
--------------------------------------------------
def search = node.client.search {
    indices "test"
    types "type1"
    source {
        from = 0
        size = 10
        query {
            term(test: "value")
        }
    }
}
--------------------------------------------------

Sorting (see link:{ref}/search-request-sort.html[sort]):

[source,js]
--------------------------------------------------
def search = node.client.search {
    indices "test"
    types "type1"
    source {
        query {
            term(test: "value")
        }
        sort = [
            date : [ order: "desc"]
        ]
    }
}
--------------------------------------------------
