5.2.7. 多元化采集聚合
多元化采集聚合
同 sampler
聚合一样,这是一个过滤聚合,用于把子聚合的处理限制为一个得分最高的文档的样本。diversified_sampler
聚合增加了限制共有一个值的匹配数量的能力,例如 “作者”。
注意
任何优秀的市场研究人员都会告诉你,处理数据样本时,相比只能反映单一观点的样本来说,健康的、能反映多种观点的样本更加重要。聚合也是如此。采用多样化的设置进行抽样可以提供一种方法来消除内容偏差(人口过多的地区,时间轴上的峰值或者活跃的论坛邮件发送者)。
用例示例:
- 将分析的重点放在高相关性匹配上,而不是低质量的长尾词的匹配上
- 确保不同来源的内容能够被公平的展示,以便消除分析中的偏差
significant_terms
能通过单一样本就产生有用的结果,减少了聚合的成本
使用 field
或者 script
设置可以提供用来删除重复数据的值。max_docs_per_value
设置了在任何共享同一值的分片上收集的最大文档数。max_docs_per_value
默认设置为 1。
当 选择 field
或 script
后,在同一个文档中产生了多个值,聚合会抛出一个错误(由于效率问题,不支持使用多值字段进行重复数据删除)。
示例:
我们可能很想看看在 StackOverflow 论坛上哪些标签和 #elasticsearch
有很强的关联,但是会忽略多产用户的影响,这些用户倾向于把 #Kibana 误拼写为 #Cabana。
POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:elasticsearch"
}
},
"aggs": {
"my_unbiased_sample": {
"diversified_sampler": {
"shard_size": 200,
"field" : "author"
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": ["elasticsearch"]
}
}
}
}
}
}
响应结果:
{
...
"aggregations": {
"my_unbiased_sample": {
"doc_count": 151,①
"keywords": {②
"doc_count": 151,
"bg_count": 650,
"buckets": [
{
"key": "kibana",
"doc_count": 150,
"score": 2.213,
"bg_count": 200
}
]
}
}
}
}
① 总共采样了 151 个文档。
② significant_terms 聚合的结果不会因为任何一个作者的坏习惯而产生偏差,因为我们要求样本中的任何一位作者最多有一篇帖子。
脚本示例:
在这种情况下,我们可能希望使字段值的组合更加多样化。我们可以使用一个脚本来产生一个标签字段中多个值的哈希值,以确保我们没有由同样标签组成的样本。
POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:kibana"
}
},
"aggs": {
"my_unbiased_sample": {
"diversified_sampler": {
"shard_size": 200,
"max_docs_per_value" : 3,
"script" : {
"lang": "painless",
"source": "doc['tags'].hashCode()"
}
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": ["kibana"]
}
}
}
}
}
}
响应结果:
{
...
"aggregations": {
"my_unbiased_sample": {
"doc_count": 6,
"keywords": {
"doc_count": 6,
"bg_count": 650,
"buckets": [
{
"key": "logstash",
"doc_count": 3,
"score": 2.213,
"bg_count": 50
},
{
"key": "elasticsearch",
"doc_count": 3,
"score": 1.34,
"bg_count": 200
}
]
}
}
}
}
shard_size
shard_size
参数限制了在每个分片处理的样本中收集的顶级评分文档数量。默认值为 100。
max_docs_per_value
max_docs_per_value
是一个可选参数,该参数限制了每次数据去重时允许的文档数量。默认设置为“1”。
execution_hint
可选设置 execution_hint
可以影响用于数据去重的值的管理。每个选项在执行数据去重时都会在内存中保存 shard_size
值,但是可以按以下方式控制所保存的值的类型:
- 直接保存字段值(
map
) - 保存根据 Lucene 索引确定的字段的序值(
global_ordinals
) - 保存字段值的哈希值 - 具有哈希冲突的可能(
bytes_hash
)
如果信息能够从 Lucene 索引中获取,则使用默认设置 global_ordinals
,否则的话则使用 map
。 在某些情况下,设置 bytes_hash
被证明更快,但是由于存在哈希冲突的可能性,在数据去重逻辑中可能会产生误报。要注意的是,如果 execution_hint 参数指定的方式不存在 Elasticsearch 将会无视,而且这些都没有保证向后兼容。
局限性
无法嵌套在 breadth_first
聚合下
作为基于质量的过滤器,diversified_sampler
聚合需要获取每个文档生成的相关性得分。因此,它不能嵌套在 collect_mode
从默认的 depth_first
模式切换成 breadth_first
模式的 terms
聚合下,因为这丢弃了分数。在这种情况下,将引发错误。
数据去重逻辑受限
数据去重逻辑仅适用于一个分片级别,因此不支持于分片之间。
没有为 地理位置/日期 提供专门的语法
目前定义多样化值的语法由 field
或 script
决定,因此没有添加语法糖来表达地理位置或日期单位,例如 “7d”(七天)。这种支持可能会在以后的版本中添加,用户当前必须使用 script 来创建这些类型的值。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。