2015-06-24 17:27:19 -04:00
[[java-search]]
2013-08-28 19:24:34 -04:00
== Search API
2014-05-12 22:07:46 -04:00
The search API allows one to execute a search query and get back search hits
2013-08-28 19:24:34 -04:00
that match the query. It can be executed across one or more indices and
2015-06-24 17:27:19 -04:00
across one or more types. The query can provided using the <<java-query-dsl,query Java API>>.
The body of the search request is built using the `SearchSourceBuilder`. Here is an example:
2013-08-28 19:24:34 -04:00
[source,java]
--------------------------------------------------
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.QueryBuilders.*;
--------------------------------------------------
[source,java]
--------------------------------------------------
SearchResponse response = client.prepareSearch("index1", "index2")
.setTypes("type1", "type2")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
2015-06-24 17:27:19 -04:00
.setQuery(QueryBuilders.termQuery("multi", "test")) // Query
.setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18)) // Filter
2013-08-28 19:24:34 -04:00
.setFrom(0).setSize(60).setExplain(true)
.execute()
.actionGet();
--------------------------------------------------
Note that all parameters are optional. Here is the smallest search call
you can write:
[source,java]
--------------------------------------------------
// MatchAll on the whole cluster with all default options
SearchResponse response = client.prepareSearch().execute().actionGet();
--------------------------------------------------
2015-04-28 19:28:54 -04:00
NOTE: Although the Java API defines the additional search types QUERY_AND_FETCH and
DFS_QUERY_AND_FETCH, these modes are internal optimizations and should not
be specified explicitly by users of the API.
2013-08-28 19:24:34 -04:00
For more information on the search operation, check out the REST
2013-09-03 10:15:28 -04:00
{ref}/search.html[search] docs.
2013-08-28 19:24:34 -04:00
2013-09-03 10:15:07 -04:00
2015-06-24 17:27:19 -04:00
[[java-search-scrolling]]
2013-08-28 19:24:34 -04:00
=== Using scrolls in Java
2013-09-03 10:15:28 -04:00
Read the {ref}/search-request-scroll.html[scroll documentation]
2013-08-28 19:24:34 -04:00
first!
[source,java]
--------------------------------------------------
import static org.elasticsearch.index.query.QueryBuilders.*;
QueryBuilder qb = termQuery("multi", "test");
SearchResponse scrollResp = client.prepareSearch(test)
.setSearchType(SearchType.SCAN)
.setScroll(new TimeValue(60000))
.setQuery(qb)
.setSize(100).execute().actionGet(); //100 hits per shard will be returned for each scroll
//Scroll until no hits are returned
2015-09-11 17:08:37 -04:00
do {
2015-01-15 13:01:52 -05:00
for (SearchHit hit : scrollResp.getHits().getHits()) {
2013-08-28 19:24:34 -04:00
//Handle the hit...
}
2015-09-11 17:08:37 -04:00
2016-01-19 08:42:29 -05:00
scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
2015-09-11 17:08:37 -04:00
} while(scrollResp.getHits().getHits().length != 0); // Zero hits mark the end of the scroll and the while loop.
2013-08-28 19:24:34 -04:00
--------------------------------------------------
2016-02-25 07:13:02 -05:00
[NOTE]
====
The size-parameter is per shard, so if you run a query against multiple indices (leading to many shards being involved in the query) the result might be more documents per execution of the scroll than you would expect!
====
2013-08-28 19:24:34 -04:00
2015-06-24 17:27:19 -04:00
[[java-search-msearch]]
2013-08-28 19:24:34 -04:00
=== MultiSearch API
2013-09-03 10:15:28 -04:00
See {ref}/search-multi-search.html[MultiSearch API Query]
2013-08-28 19:24:34 -04:00
documentation
[source,java]
--------------------------------------------------
SearchRequestBuilder srb1 = node.client()
2015-06-03 11:08:32 -04:00
.prepareSearch().setQuery(QueryBuilders.queryStringQuery("elasticsearch")).setSize(1);
2013-08-28 19:24:34 -04:00
SearchRequestBuilder srb2 = node.client()
.prepareSearch().setQuery(QueryBuilders.matchQuery("name", "kimchy")).setSize(1);
MultiSearchResponse sr = node.client().prepareMultiSearch()
.add(srb1)
.add(srb2)
.execute().actionGet();
2013-10-17 03:47:58 -04:00
// You will get all individual responses from MultiSearchResponse#getResponses()
2013-08-28 19:24:34 -04:00
long nbHits = 0;
2013-10-06 15:18:43 -04:00
for (MultiSearchResponse.Item item : sr.getResponses()) {
SearchResponse response = item.getResponse();
nbHits += response.getHits().getTotalHits();
2013-08-28 19:24:34 -04:00
}
--------------------------------------------------
2013-09-03 10:15:07 -04:00
2014-05-15 06:36:05 -04:00
[[java-search-aggs]]
=== Using Aggregations
2013-08-28 19:24:34 -04:00
2014-05-15 06:36:05 -04:00
The following code shows how to add two aggregations within your search:
2013-08-28 19:24:34 -04:00
[source,java]
--------------------------------------------------
SearchResponse sr = node.client().prepareSearch()
.setQuery(QueryBuilders.matchAllQuery())
2014-05-15 06:36:05 -04:00
.addAggregation(
AggregationBuilders.terms("agg1").field("field")
)
.addAggregation(
AggregationBuilders.dateHistogram("agg2")
.field("birth")
2016-02-12 08:54:10 -05:00
.dateHistogramInterval(DateHistogramInterval.YEAR)
2014-05-15 06:36:05 -04:00
)
2013-08-28 19:24:34 -04:00
.execute().actionGet();
// Get your facet results
2014-05-15 06:36:05 -04:00
Terms agg1 = sr.getAggregations().get("agg1");
DateHistogram agg2 = sr.getAggregations().get("agg2");
2013-08-28 19:24:34 -04:00
--------------------------------------------------
2014-05-15 06:36:05 -04:00
See <<java-aggs,Aggregations Java API>>
2013-08-28 19:24:34 -04:00
documentation for details.
2014-11-30 15:17:53 -05:00
2015-06-24 17:27:19 -04:00
[[java-search-terminate-after]]
=== Terminate After
2014-11-30 15:17:53 -05:00
2015-06-24 17:27:19 -04:00
The maximum number of documents to collect for each shard, upon reaching which the query execution will terminate early.
If set, you will be able to check if the operation terminated early by asking for `isTerminatedEarly()` in the
`SearchResponse` onject:
2014-11-30 15:17:53 -05:00
[source,java]
--------------------------------------------------
2015-06-24 17:27:19 -04:00
SearchResponse sr = client.prepareSearch(INDEX)
.setTerminateAfter(1000) <1>
.get();
2014-11-30 15:17:53 -05:00
2015-06-24 17:27:19 -04:00
if (sr.isTerminatedEarly()) {
// We finished early
2014-11-30 15:17:53 -05:00
}
--------------------------------------------------
2015-06-24 17:27:19 -04:00
<1> Finish after 1000 docs