首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优化elasticsearch中的聚合查询

如何优化elasticsearch中的聚合查询
EN

Stack Overflow用户
提问于 2016-06-04 07:52:27
回答 1查看 1.4K关注 0票数 1

现在我使用ES来进行聚合。基本逻辑可以表示为

代码语言:javascript
运行
复制
select count(*)
from 
(select key, count(*) from table where *** 

按键分组,其计数(*)>c)z,这里的where过滤器条件是由最终用户指定的,这意味着我不能做任何预工作。我用桶选择器实现了逻辑。

但是,在我的例子中,通常有几百万个不同的键,这意味着有几百万个按ES返回的桶,默认情况下按其doc_count排序。这很费时。我不知道是否有一些策略可以加速查询,例如关闭排序。

EN

回答 1

Stack Overflow用户

发布于 2016-06-04 12:27:04

如果我正确理解,您的查询将执行以下操作:

  1. key对所有条目进行分组
  2. 删除所有分组条目,其中count <= c
  3. 清点所有剩余的分组条目

那么SELECT key, count(*)就没用了,因为它再也不会被使用了。您可以简单地使用SELECT 1

这个查询根本不需要排序。

基本上有3种方法可以加快查询的速度:

  1. 找更多的服务器!这个聚合很容易由ES在多个节点上并行执行。
  2. 不要在需要时聚合数据,而是使用每天执行一次的后台任务。这个后台任务基本上将创建与您在STORE 2中看到的数据相同的数据。当然,这样您将始终必须交付旧的数据,但它将加快的事情!
  3. 预置你的数据!使用一些简单的键值存储(甚至可以只使用ES进行此操作),然后执行以下操作:
代码语言:javascript
运行
复制
- When a new document is getting inserted: Get its key, and increment the number.
- When a document is getting deleted: Get its key, and decrement the counter.

然后基本上有两个存储:一个用于实际文档,一个用于聚合数据,即

代码语言:javascript
运行
复制
STORE 1:
[
  {id: 1, key: foo, ...},
  {id: 2, key: foo, ...},
  {id: 3, key: bar, ...},
  {id: 4, key: baz, ...}
]

STORE 2:
[
  {id: foo, counter: 2},
  {id: bar, counter: 1},
  {id: baz, counter: 1}
]

这样,您就可以在从STORE 1中插入/删除文档时进行聚合。当然,这在插入/删除过程中更耗时,因为每次都必须触摸2个数据存储。

但是现在您可以简单地计数来自STORE 2的条目以获得结果。这将极大地提高此操作的查询性能。

你看:这总是一种权衡。你必须决定你需要什么:

  1. 活动数据+高插入/删除性能+慢速聚合
  2. 非实时数据+高插入/删除性能+快速聚合
  3. 活动数据+慢速插入/删除+快速聚合
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37627814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档