summaryrefslogtreecommitdiff
path: root/docs/java-api/search.asciidoc
diff options
context:
space:
mode:
Diffstat (limited to 'docs/java-api/search.asciidoc')
-rw-r--r--docs/java-api/search.asciidoc140
1 files changed, 140 insertions, 0 deletions
diff --git a/docs/java-api/search.asciidoc b/docs/java-api/search.asciidoc
new file mode 100644
index 0000000..5cb27b4
--- /dev/null
+++ b/docs/java-api/search.asciidoc
@@ -0,0 +1,140 @@
+[[search]]
+== Search API
+
+The search API allows to execute a search query and get back search hits
+that match the query. It can be executed across one or more indices and
+across one or more types. The query can either be provided using the
+<<query-dsl-queries,query Java API>> or
+the <<query-dsl-filters,filter Java API>>.
+The body of the search request is built using the
+`SearchSourceBuilder`. Here is an example:
+
+[source,java]
+--------------------------------------------------
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.search.SearchType;
+import org.elasticsearch.index.query.FilterBuilders.*;
+import org.elasticsearch.index.query.QueryBuilders.*;
+--------------------------------------------------
+
+[source,java]
+--------------------------------------------------
+SearchResponse response = client.prepareSearch("index1", "index2")
+ .setTypes("type1", "type2")
+ .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
+ .setQuery(QueryBuilders.termQuery("multi", "test")) // Query
+ .setPostFilter(FilterBuilders.rangeFilter("age").from(12).to(18)) // Filter
+ .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();
+--------------------------------------------------
+
+For more information on the search operation, check out the REST
+{ref}/search.html[search] docs.
+
+
+[[scrolling]]
+=== Using scrolls in Java
+
+Read the {ref}/search-request-scroll.html[scroll documentation]
+first!
+
+[source,java]
+--------------------------------------------------
+import static org.elasticsearch.index.query.FilterBuilders.*;
+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
+while (true) {
+ scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet();
+ for (SearchHit hit : scrollResp.getHits()) {
+ //Handle the hit...
+ }
+ //Break condition: No hits are returned
+ if (scrollResp.getHits().getHits().length == 0) {
+ break;
+ }
+}
+--------------------------------------------------
+
+
+=== Operation Threading
+
+The search API allows to set the threading model the operation will be
+performed when the actual execution of the API is performed on the same
+node (the API is executed on a shard that is allocated on the same
+server).
+
+There are three threading modes.The `NO_THREADS` mode means that the
+search operation will be executed on the calling thread. The
+`SINGLE_THREAD` mode means that the search operation will be executed on
+a single different thread for all local shards. The `THREAD_PER_SHARD`
+mode means that the search operation will be executed on a different
+thread for each local shard.
+
+The default mode is `THREAD_PER_SHARD`.
+
+
+[[msearch]]
+=== MultiSearch API
+
+See {ref}/search-multi-search.html[MultiSearch API Query]
+documentation
+
+[source,java]
+--------------------------------------------------
+SearchRequestBuilder srb1 = node.client()
+ .prepareSearch().setQuery(QueryBuilders.queryString("elasticsearch")).setSize(1);
+SearchRequestBuilder srb2 = node.client()
+ .prepareSearch().setQuery(QueryBuilders.matchQuery("name", "kimchy")).setSize(1);
+
+MultiSearchResponse sr = node.client().prepareMultiSearch()
+ .add(srb1)
+ .add(srb2)
+ .execute().actionGet();
+
+// You will get all individual responses from MultiSearchResponse#getResponses()
+long nbHits = 0;
+for (MultiSearchResponse.Item item : sr.getResponses()) {
+ SearchResponse response = item.getResponse();
+ nbHits += response.getHits().getTotalHits();
+}
+--------------------------------------------------
+
+
+[[java-search-facets]]
+=== Using Facets
+
+The following code shows how to add two facets within your search:
+
+[source,java]
+--------------------------------------------------
+SearchResponse sr = node.client().prepareSearch()
+ .setQuery(QueryBuilders.matchAllQuery())
+ .addFacet(FacetBuilders.termsFacet("f1").field("field"))
+ .addFacet(FacetBuilders.dateHistogramFacet("f2").field("birth").interval("year"))
+ .execute().actionGet();
+
+// Get your facet results
+TermsFacet f1 = (TermsFacet) sr.getFacets().facetsAsMap().get("f1");
+DateHistogramFacet f2 = (DateHistogramFacet) sr.getFacets().facetsAsMap().get("f2");
+--------------------------------------------------
+
+See <<java-facets,Facets Java API>>
+documentation for details.