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;
        }
    }

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