Elasticsearch-from size 分頁-Java示例

相關文章鏈接:

from size 分頁

下文引用自:Elasticsearch 權威指南(中文版)–分頁

在集羣系統中深度分頁
爲了理解爲什麼深度分頁是有問題的,讓我們假設在一個有5個主分片的索引中搜索。當我們請求結果的第一頁(結果1到10)時,每個分片產生自己最頂端10個結果然後返回它們給請求節點(requesting node),它再排序這所有的50個結果以選出頂端的10個結果。
現在假設我們請求第1000頁——結果10001到10010。工作方式都相同,不同的是每個分片都必須產生頂端的10010個結果。然後請求節點排序這50050個結果並丟棄50040個!
你可以看到在分佈式系統中,排序結果的花費隨着分頁的深入而成倍增長。這也是爲什麼網絡搜索引擎中任何語句不能返回多於1000個結果的原因。

from size 分頁特點:

  • 適用於淺分頁
  • 分頁越深,性能越差
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;

import java.util.function.Consumer;

/**
 * ES from size分頁
 *
 * @author zuozhu.meng
 * @date 2020/2/29
 **/
public class EsFromPageHandler {

    /**
     * Search for hit.
     *
     * @param requestBuilder the request builder
     * @param consumer       the consumer
     * @param pageSize       the page size
     */
    public static void searchForHit(SearchRequestBuilder requestBuilder, Consumer<SearchHit> consumer, int pageSize) {
        searchForResponse(requestBuilder, searchResponse -> {
            SearchHit[] searchHits = searchResponse.getHits().getHits();
            for (SearchHit searchHit : searchHits) {
                consumer.accept(searchHit);
            }
        }, pageSize);
    }

    /**
     * Search for response.
     *
     * @param requestBuilder the request builder
     * @param consumer       the consumer
     * @param pageSize       the page size
     */
    public static void searchForResponse(SearchRequestBuilder requestBuilder, Consumer<SearchResponse> consumer,
                                         int pageSize) {
        if (requestBuilder == null || consumer == null) {
            return;
        }

        long totalHits = requestBuilder.setSize(0).get().getHits().totalHits;
        int from = 0;
        while (from < totalHits) {
            SearchResponse searchResponse = requestBuilder.setSize(pageSize).setFrom(from).get();
            consumer.accept(searchResponse);
            from += pageSize;
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章