相關文章鏈接:
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;
}
}
}