最近做到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...