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();
javasql注入防范?請注意,所有參數都是可選的。 這是你可以寫的最小的搜索:
// MatchAll on the whole cluster with all default options
SearchResponse response = client.prepareSearch().execute().actionGet();
scroll documentation
一個搜索
請求返回類似a“page”of result,而scroll
API可以用一個搜索語句,檢索大量的結果(甚至所有的結果),與傳統的使用游標查詢數據庫一樣。
elasticsearch開發,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 returnedif (scrollResp.getHits().getHits().length == 0) {break;}
}
The search API允許你設置線程來執行操作,這樣實際姜執行API上執行的是相同的節點上(API上執行一個分配在同一服務器的shard上)。
jdbctemplate.query。這里有三種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
翻譯欠佳,希望不會對大家造成誤導
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态