elasticsearch的javaAPI之query API
the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits)。 它可以在跨一个或多个index上执行, 或者一个或多个types。 查询可以使用提供的 query Java API 或filter Java API 。 搜索请求的主体是建立使用 SearchSourceBuilder上
。 这里有一个例子:
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.index.query.FilterBuilders.*; import org.elasticsearch.index.query.QueryBuilders.*;
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();
请注意,所有参数都是可选的。 这是你可以写的最小的搜索:
// MatchAll on the whole cluster with all default options SearchResponse response = client.prepareSearch().execute().actionGet();
scroll documentation
一个 搜索
请求返回类似a“page”of result,而 scroll
API可以用一个搜索语句,检索大量的结果(甚至所有的结果),与传统的使用游标查询数据库一样。
scrolling不用于实时请求,而是处理大量的数据,例如为了不同的配置,重建索引的内容
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) { for (SearchHit hit : scrollResp.getHits()) { //Handle the hit... } scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet(); //Break condition: No hits are returned if (scrollResp.getHits().getHits().length == 0) { break; } }
The search API允许你设置线程来执行操作,这样实际姜执行API上执行的是相同的节点上(API上执行一个分配在同一服务器的shard上)。
这里有三种threading modes, The NO_THREADS
模式意味着查询操作将zaicalling thread上执行。 SINGLE_THREAD
模式意味着将对local shards执行搜索操作,是在single different thread。 THREAD_PER_SHARD
意味着搜索操作将在不同的线程上执行,对于每一个local shard。
默认的模式是 THREAD_PER_SHARD
。
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(); }
下面的代码显示了如何在你的搜索里添加两个facets:
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");
例子是facets的,但是Elasticsearch Aggregations也是不错的选择
原文: http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/search.html#msearch
翻译欠佳,希望不会对大家造成误导