为了账号安全,请及时绑定邮箱和手机立即绑定

elasticsearch 数据量大,如何全表汇总

elasticsearch 数据量大,如何全表汇总

慕森王 2018-07-21 22:17:30
有多个 index,记录产品数据,每个index近20G大想对这些index每一个做汇总,比如汇总某个index中所有商家统计数据,并保存到新index中,但aggs查询又无法分页,我知道还有scroll,scan,但又看到如果scroll查询中包含聚合,只有最初的查询结果是聚合结果scan查询不支持聚合所以,如果我想统计整个index,有什么方案可选?
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

ES分页方案
守则:

  1. 禁止使用From/Size

  2. 获取排序数据采用search_after方法,每次只返回排序数据,不返回其他数据,排序数据保存在ES中

  3. 分页搜索采用search_after方法,根据ES排序索引设置搜索起点,每次返回所有数据

优点: 访问速度最快,理论上是单页访问时间秒级,对ES压力小
缺点:需要单独一个线程维护排序数据数组,且由于进行排序的索引中ES数据可能被删除,而ES排序索引的数据还未更新,访问数据有较低概率出现单页某条数据被新数据挤出分页界面的概率,有较低概率会出现前一页的最后一条数据出现在本页,本页的最后一条数据出现在下一页的情况。
具体实施细节:程序一开始就会在ES中创建一个排序索引,然后采用search_after算法,不断计算要进行分页的索引的排序数据,保存在ES中,此程序是循环进行。然后要访问的时候只需要读取分页索引和对应的分页排序索引的值,就可以得出对应页的数据。

Restful过程介绍:

  1. 获取排序数据的Restful语句

第一页:
GET test_delete/_search
{

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

}
获得最后一项排序数据
第N页:
GET test_delete/_search
{

"size":15,"sort":[
  {"randomDouble":"DESC"},
  {"randomInt": "DESC"},
  {"phone":"DESC"}
],"search_after":[
      排序数据
    ],"_source": "{}"

}
这个过程开一个线程,不断循环更新排序数据

  1. 获取对应页数据的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":[
      排序数据
    ],

}
对比获取排序数据,该restful语句删除"_source": "{}",以此来获得该页所有数据


查看完整回答
反对 回复 2018-07-28
  • 1 回答
  • 0 关注
  • 1670 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信