[ElasticSearch]Java APIのスクロール検索(Scroll API)


一般的な検索要求はすべて1つの“ページ”のデータを返して、データの量の大部分に関わらずいっしょにユーザーに返して、Scroll APIは私達が大量のデータ(甚だしきに至ってはすべてのデータ)を検索することを許可することができます.Scroll APIでは、初期段階の検索を行い、結果が残らないまでロットをElasticsearchから結果を引き出し続けることができます.これは、従来のデータベースのcursors(カーソル)に似ています.
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件のデータを要求します.    /**     *       * @param client     */    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
  •    }
    1. 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.]
    2. 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     * @param client     */    public static String searchByScroll(Client client) {
    3.        String index = "simple-index";
    4.        String type = "simple-type";
    5.        //
    6.        SearchRequestBuilder searchRequestBuilder = client.prepareSearch();        searchRequestBuilder.setIndices(index);        searchRequestBuilder.setTypes(type);        searchRequestBuilder.setScroll(new TimeValue(30000));
    7.        //
    8.        SearchResponse searchResponse = searchRequestBuilder.get();
    9.        String scrollId = searchResponse.getScrollId();
    10.        logger.info("--------- searchByScroll scrollID {}", scrollId);
    11.        SearchHit[] searchHits = searchResponse.getHits().getHits();
    12.        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     * @param client     * @param scrollId     */    public static void searchByScrollId(Client client, String scrollId){

    13.        TimeValue timeValue = new TimeValue(30000);
    14.        SearchScrollRequestBuilder searchScrollRequestBuilder;        SearchResponse response;        //        while (true) {
    15.            logger.info("--------- searchByScroll scrollID {}", scrollId);
    16.            searchScrollRequestBuilder = client.prepareSearchScroll(scrollId);
    17.            //            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();
    18.        } // while
    19.    }
    20. 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 * @param client * @param scrollIdList * @return */ public static boolean clearScroll(Client client, List<String> scrollIdList){ ClearScrollRequestBuilder clearScrollRequestBuilder = client.prepareClearScroll(); clearScrollRequestBuilder.setScrollIds(scrollIdList); ClearScrollResponse response = clearScrollRequestBuilder.get(); return response.isSucceeded(); } /** * ID * @param client * @param scrollId * @return */ 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