ES Terms 聚合数据不确定性
发布时间:2020-12-14 05:07:14 所属栏目:百科 来源:网络整理
导读:Elasticsearch是一个 分布式 的搜索引擎,每个索引都可以有多个分片,用来将一份大索引的数据切分成多个小的物理索引,解决单个索引数据量过大导致的性能问题,另外每个shard还可以配置多个副本,来保证高可靠以及更好的抗并发的能力。 将一个索引切分成多个
Elasticsearch是一个分布式的搜索引擎,每个索引都可以有多个分片,用来将一份大索引的数据切分成多个小的物理索引,解决单个索引数据量过大导致的性能问题,另外每个shard还可以配置多个副本,来保证高可靠以及更好的抗并发的能力。
将一个索引切分成多个shard,大多数时候是没有问题的,但是在es里面如果索引被切分成多个shard,在使用group进行聚合时,可能会出现问题,参见官网文档
先了解ES 聚合的核心概念:桶(bucket)和指标(metric)
??聚合是由桶和指标组成的。聚合可能只有一个桶,可能只有一个指标,或者可能两个都有。转换成成对应的sql语句如下:
select count(*) from Table_A? group by FieldA
其中:bucket 相当于 group by?FieldA --> FieldA 字段内相同的数据,就会被划分到一个bucket中
metric 相当于 count(*) --> 对每个FieldA? bucket中所有的数据计算一个数量
如下图:
?
针对官网的例子,描述group count如果有多个shard可能会出现的问题
? ?? 这样看来最终的top5的值并不是100% 准确的
虽然我们可以调大返回size的个数来提高精确度,但是size个数的提升,也意味着有更多的数据会被返回,从而会导致检索性能的下降,这一点是需要找到平衡点的,? 为解决这种不精确的统计,可以尝试的方案:
? ? 3.?size与shard_size
上面提到那个例子,如果聚合的key本来就很少,那么它的聚合结果也是准确的,比如按性别,月份聚合,因为这些返回的key,都是有限的,所以结果没问题,但是一旦对分组的个数没法确定,这种情况下出现问题的几率就比较大,跨表或者跨分片聚合其实在任何db系统里面都会存在这种问题,所以我们应该尽量在设计业务时就考虑到这种特殊情况,然后最终做特殊处理。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- XML::Simple, XMLin()
- ruby-on-rails – 如何在click_link / button之后使用黄瓜和
- React-native 出bug 记录
- c# – Linq to Entities Skip()和Take()
- objective-c – Object由“0键/值对”表示,而不是LLVM内存地
- 正则表达式之元字符
- XML的四种解析方式之DOM
- Binary XML file line #10: Error inflating class android
- c# – 我应该使用哪种类型的Visual Studio项目来创建“隐藏
- ruby-on-rails – 如何使用has_one关联连接关联表