[ElasticSearch]Java APIのスクロール検索(Scroll API)
Scroll APIの作成は、リアルタイムのユーザ応答のためではなく、大量のデータを処理するためである(Scroling is not intended for real time user requests,but rather for processing large amounts of data).scrollリクエストから返された結果は反映されただけです search スナップショット(The results that are returned from a scroll request reflect the state of the index at the time that the initial search request was made, like a snapshot in time).後続のドキュメントの変更(インデックス、更新、または削除)は、後続の検索要求にのみ影響します.
1.一般要求
一度に大量のデータを返したい場合、次のコードで58000件のデータを要求します.
/**
*
*
*/
public static void search(Client client) {
String index = "simple-index";
String type = "simple-type";
//
SearchRequestBuilder searchRequestBuilder = client.prepareSearch();
searchRequestBuilder.setIndices(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setSize(58000);
//
SearchResponse searchResponse = searchRequestBuilder.get();
//
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSource().toString();
logger.info("--------- searchByScroll source {}", source);
} // for
}
:
Caused by: QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [10000] but was [58000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.]
at org.elasticsearch.search.internal.DefaultSearchContext.preProcess(DefaultSearchContext.java:212)
at org.elasticsearch.search.query.QueryPhase.preProcess(QueryPhase.java:103)
at org.elasticsearch.search.SearchService.createContext(SearchService.java:676)
at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:620)
at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:371)
at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:368)
at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:365)
at org.elasticsearch.transport.TransportRequestHandler.messageReceived(TransportRequestHandler.java:33)
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
... 3 more
から かるように、 の1 の が も いのは[10000]である. たちの はすでに を えているので、エラーを し、 は たちがビッグデータ を した にScroll APIを することを しています.
2.Scroll APIリクエストの
scrollを するには、 をクエリーで する があります. scroll パラメータは、Elasticsearchが するコンテキスト をどのくらい する があるか(スクロール )を します.searchRequestBuilder.setScroll(new TimeValue(60000));
のコードでは、スクロールの などのクエリー とスクロール を します(setScroll()メソッドを します).スクロールIDをSearchResponseオブジェクトのgetScrolId()メソッドで した.スクロールIDは のリクエストで されます. /**
* scroll
*
*/
public static String searchByScroll(Client client) {
String index = "simple-index";
String type = "simple-type";
//
SearchRequestBuilder searchRequestBuilder = client.prepareSearch();
searchRequestBuilder.setIndices(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setScroll(new TimeValue(30000));
//
SearchResponse searchResponse = searchRequestBuilder.get();
String scrollId = searchResponse.getScrollId();
logger.info("--------- searchByScroll scrollID {}", scrollId);
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSource().toString();
logger.info("--------- searchByScroll source {}", source);
} // for
return scrollId;
}
ID, ID scroll API 。 , search 。
hits (Each call to the scroll
API returns the next batch of results until there are no more results left to return, ie the hits
array is empty). /**
* ID
*
*
*/
public static void searchByScrollId(Client client, String scrollId){
TimeValue timeValue = new TimeValue(30000);
SearchScrollRequestBuilder searchScrollRequestBuilder;
SearchResponse response;
//
while (true) {
logger.info("--------- searchByScroll scrollID {}", scrollId);
searchScrollRequestBuilder = client.prepareSearchScroll(scrollId);
//
searchScrollRequestBuilder.setScroll(timeValue);
//
response = searchScrollRequestBuilder.get();
// hits
if (response.getHits().getHits().length == 0) {
break;
} // if
//
SearchHit[] searchHits = response.getHits().getHits();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSource().toString();
logger.info("--------- searchByScroll source {}", source);
} // for
// ID
scrollId = response.getScrollId();
} // while
}
:
ID—— ID 。(The initial search request and each subsequent scroll request returns a new_scroll_id
— only the most recent _scroll_id
should be used)
は のスクロール が ってくるスクロールIDが じなので、 の については、よくわかりませんが、はっきりしたお らせがあります.ありがとうございます.
スクロール を えて、このスクロールIDを してデータを し けると、エラーが します.Caused by: SearchContextMissingException[No search context found for id [2861]]
at org.elasticsearch.search.SearchService.findContext(SearchService.java:613)
at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:403)
at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryScrollTransportHandler.messageReceived(SearchServiceTransportAction.java:384)
at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryScrollTransportHandler.messageReceived(SearchServiceTransportAction.java:381)
at org.elasticsearch.transport.TransportRequestHandler.messageReceived(TransportRequestHandler.java:33)
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
3.スクロールIDの
スクロール が すると、 コンテキスト(Search Context)は に されますが、スクロールを する も きいので、スクロールを しない は、できるだけ くClear-Scroll APIを して する があります. /**
* ID
*
*
*
*/
public static boolean clearScroll(Client client, List<String> scrollIdList){
ClearScrollRequestBuilder clearScrollRequestBuilder = client.prepareClearScroll();
clearScrollRequestBuilder.setScrollIds(scrollIdList);
ClearScrollResponse response = clearScrollRequestBuilder.get();
return response.isSucceeded();
}
/**
* ID
*
*
*
*/
public static boolean clearScroll(Client client, String scrollId){
ClearScrollRequestBuilder clearScrollRequestBuilder = client.prepareClearScroll();
clearScrollRequestBuilder.addScrollId(scrollId);
ClearScrollResponse response = clearScrollRequestBuilder.get();
return response.isSucceeded();
}
4. :
https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-scroll.html
http://www.jianshu.com/p/14aa8b09c789
---------------------------------------
:
https://blog.csdn.net/u014589856/article/details/78775233
:https://www.cnblogs.com/commissar-Xia/p/11330178.html