es深度分頁處理

2021-09-24 13:37:20 字數 1680 閱讀 9003

最近做到es分頁的需求,由於es的from to的分頁只能在10000條以內的資料進行分頁,超過了10000去查詢就會報錯。在網上找了一下都說用scroll,但是沒有乙個完美的解決方案。然後我就開始自擼了。我用了elasticsearch-rest-high-level-client-5.6.3。

elasticsearch-rest-high-level的配置我這邊不再贅述了,網上可以搜到很多。具體看**。

下面**是組裝搜尋的條件。

public listsearchquestionbo(questionsearchdto questionsearchdto)else

}if(stringutils.isnotblank(questionsearchdto.getid()))

if(collectionutils.isnotempty(questionsearchdto.getexamlist()))

// 題幹

if (stringutils.isnotempty(questionsearchdto.getcontent()))

}contentfilter.must(contentfilter1);

boolquerybuilder.must(contentfilter);

}if (stringutils.isnotblank(questionsearchdto.getoptions()))

boolquerybuilder.must(optionfilter);

}if(null != questionsearchdto.getquestiontype())

if(null != questionsearchdto.getedittype())

if(null != questionsearchdto.getsubquestion())

searchsourcebuilder.query(boolquerybuilder);

searchrequest.source(searchsourcebuilder);

searchrequest.source(searchsourcebuilder);

listquestionbolist = esservice.searchquestionbo(searchrequest,questionsearchdto);

return questionbolist;

這個才是真正的分頁查詢。 

public listsearchquestionbo(searchrequest searchrequest, questionsearchdto questionsearchdto)else 

}searchhits searchhits = searchresponse.gethits();

searchhit searchhit = searchhits.gethits();

long total = searchhits.gettotalhits();

questionsearchdto.settotal(total);

for (int i = 0;i < searchhit.length;i++)

return questionbolist;

} catch (ioexception e)

return questionbolist;

}

es深度分頁問題

1.from size es 預設採用的分頁方式是 from size 的形式,在深度分頁的情況下,這種使用方式效率是非常低的,比如 from 5000,size 10,es 需要在各個分片上匹配排序並得到5000 10條有效資料,然後在結果集中取最後10條,es預設是10000條資料,可以通過設定...

ES 深度分頁 滾動搜尋

深度分頁其實就是搜尋的深淺度,比如第1頁,第2頁,第10頁,第20頁,是比較淺的 第10000頁,第20000頁就是很深了。使用如下操作 from 9990,size 10 from 9999,size 10 我們在獲取第9999條到10009條資料的時候,其實每個分片都會拿到10009條資料,然後...

ES第六天 深度分頁和scroll search

我們由前面知道,es的資料是分片進行儲存的,整體資料會被分布在不同的primary分片上面,因此,如果一次比較深度的分頁且排序的操作,成本將會比較大 假如使用者要查詢5001 5050條資料,按照 由低到高進行排序,那麼es的查詢會發生什麼?因為資料是分片儲存,因此需要每個分片都拿出自身的前5050...