在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ elasticsearch 數(shù)據(jù)量大,如何全表匯總

elasticsearch 數(shù)據(jù)量大,如何全表匯總

有多個 index,記錄產(chǎn)品數(shù)據(jù),每個index20G

想對這些index每一個做匯總,比如匯總某個index中所有商家統(tǒng)計數(shù)據(jù),并保存到新index中,但aggs查詢又無法分頁,我知道還有scroll,scan,但又看到

如果scroll查詢中包含聚合,只有最初的查詢結(jié)果是聚合結(jié)果
scan查詢不支持聚合

所以,如果我想統(tǒng)計整個index,有什么方案可選?

回答
編輯回答
誮惜顏

ES分頁方案
守則:

  1. 禁止使用From/Size
  2. 獲取排序數(shù)據(jù)采用search_after方法,每次只返回排序數(shù)據(jù),不返回其他數(shù)據(jù),排序數(shù)據(jù)保存在ES中
  3. 分頁搜索采用search_after方法,根據(jù)ES排序索引設(shè)置搜索起點,每次返回所有數(shù)據(jù)

優(yōu)點: 訪問速度最快,理論上是單頁訪問時間秒級,對ES壓力小
缺點:需要單獨一個線程維護排序數(shù)據(jù)數(shù)組,且由于進行排序的索引中ES數(shù)據(jù)可能被刪除,而ES排序索引的數(shù)據(jù)還未更新,訪問數(shù)據(jù)有較低概率出現(xiàn)單頁某條數(shù)據(jù)被新數(shù)據(jù)擠出分頁界面的概率,有較低概率會出現(xiàn)前一頁的最后一條數(shù)據(jù)出現(xiàn)在本頁,本頁的最后一條數(shù)據(jù)出現(xiàn)在下一頁的情況。
具體實施細節(jié):程序一開始就會在ES中創(chuàng)建一個排序索引,然后采用search_after算法,不斷計算要進行分頁的索引的排序數(shù)據(jù),保存在ES中,此程序是循環(huán)進行。然后要訪問的時候只需要讀取分頁索引和對應(yīng)的分頁排序索引的值,就可以得出對應(yīng)頁的數(shù)據(jù)。

Restful過程介紹:

  1. 獲取排序數(shù)據(jù)的Restful語句

第一頁:
GET test_delete/_search
{

"size":15,
"sort":[
  {"randomDouble":"DESC"},
  {"randomInt": "DESC"},
  {"phone":"DESC"}
],
"_source": "{}"

}
獲得最后一項排序數(shù)據(jù)
第N頁:
GET test_delete/_search
{

"size":15,
"sort":[
  {"randomDouble":"DESC"},
  {"randomInt": "DESC"},
  {"phone":"DESC"}
],
"search_after":[
      排序數(shù)據(jù)
    ],
"_source": "{}"

}
這個過程開一個線程,不斷循環(huán)更新排序數(shù)據(jù)

  1. 獲取對應(yīng)頁數(shù)據(jù)的Restful語句

第一頁:
GET test_delete/_search
{

"size":15,
"sort":[
  {"randomDouble":"DESC"},
  {"randomInt": "DESC"},
  {"phone":"DESC"}
]

}
第N頁:
GET test_delete/_search
{

"size":15,
"sort":[
  {"randomDouble":"DESC"},
  {"randomInt": "DESC"},
  {"phone":"DESC"}
],
"search_after":[
      排序數(shù)據(jù)
    ],

}
對比獲取排序數(shù)據(jù),該restful語句刪除"_source": "{}",以此來獲得該頁所有數(shù)據(jù)

2017年7月7日 15:36