1 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
ES分頁(yè)方案
守則:
禁止使用From/Size
獲取排序數(shù)據(jù)采用search_after方法,每次只返回排序數(shù)據(jù),不返回其他數(shù)據(jù),排序數(shù)據(jù)保存在ES中
分頁(yè)搜索采用search_after方法,根據(jù)ES排序索引設(shè)置搜索起點(diǎn),每次返回所有數(shù)據(jù)
優(yōu)點(diǎn): 訪問(wèn)速度最快,理論上是單頁(yè)訪問(wèn)時(shí)間秒級(jí),對(duì)ES壓力小
缺點(diǎn):需要單獨(dú)一個(gè)線程維護(hù)排序數(shù)據(jù)數(shù)組,且由于進(jìn)行排序的索引中ES數(shù)據(jù)可能被刪除,而ES排序索引的數(shù)據(jù)還未更新,訪問(wèn)數(shù)據(jù)有較低概率出現(xiàn)單頁(yè)某條數(shù)據(jù)被新數(shù)據(jù)擠出分頁(yè)界面的概率,有較低概率會(huì)出現(xiàn)前一頁(yè)的最后一條數(shù)據(jù)出現(xiàn)在本頁(yè),本頁(yè)的最后一條數(shù)據(jù)出現(xiàn)在下一頁(yè)的情況。
具體實(shí)施細(xì)節(jié):程序一開(kāi)始就會(huì)在ES中創(chuàng)建一個(gè)排序索引,然后采用search_after算法,不斷計(jì)算要進(jìn)行分頁(yè)的索引的排序數(shù)據(jù),保存在ES中,此程序是循環(huán)進(jìn)行。然后要訪問(wèn)的時(shí)候只需要讀取分頁(yè)索引和對(duì)應(yīng)的分頁(yè)排序索引的值,就可以得出對(duì)應(yīng)頁(yè)的數(shù)據(jù)。
Restful過(guò)程介紹:
獲取排序數(shù)據(jù)的Restful語(yǔ)句
第一頁(yè):
GET test_delete/_search
{
"size":15,"sort":[ {"randomDouble":"DESC"}, {"randomInt": "DESC"}, {"phone":"DESC"} ],"_source": "{}"
}
獲得最后一項(xiàng)排序數(shù)據(jù)
第N頁(yè):
GET test_delete/_search
{
"size":15,"sort":[ {"randomDouble":"DESC"}, {"randomInt": "DESC"}, {"phone":"DESC"} ],"search_after":[ 排序數(shù)據(jù) ],"_source": "{}"
}
這個(gè)過(guò)程開(kāi)一個(gè)線程,不斷循環(huán)更新排序數(shù)據(jù)
獲取對(duì)應(yīng)頁(yè)數(shù)據(jù)的Restful語(yǔ)句
第一頁(yè):
GET test_delete/_search
{
"size":15,"sort":[ {"randomDouble":"DESC"}, {"randomInt": "DESC"}, {"phone":"DESC"} ]
}
第N頁(yè):
GET test_delete/_search
{
"size":15,"sort":[ {"randomDouble":"DESC"}, {"randomInt": "DESC"}, {"phone":"DESC"} ],"search_after":[ 排序數(shù)據(jù) ],
}
對(duì)比獲取排序數(shù)據(jù),該restful語(yǔ)句刪除"_source": "{}",以此來(lái)獲得該頁(yè)所有數(shù)據(jù)
添加回答
舉報(bào)