5.2.7. 多元化采集聚合

多元化采集聚合

sampler 聚合一样,这是一个过滤聚合,用于把子聚合的处理限制为一个得分最高的文档的样本。diversified_sampler 聚合增加了限制共有一个值的匹配数量的能力,例如 “作者”。

注意
任何优秀的市场研究人员都会告诉你,处理数据样本时,相比只能反映单一观点的样本来说,健康的、能反映多种观点的样本更加重要。聚合也是如此。采用多样化的设置进行抽样可以提供一种方法来消除内容偏差(人口过多的地区,时间轴上的峰值或者活跃的论坛邮件发送者)。

用例示例:

  • 将分析的重点放在高相关性匹配上,而不是低质量的长尾词的匹配上
  • 确保不同来源的内容能够被公平的展示,以便消除分析中的偏差
  • significant_terms 能通过单一样本就产生有用的结果,减少了聚合的成本

使用 field 或者 script 设置可以提供用来删除重复数据的值。max_docs_per_value 设置了在任何共享同一值的分片上收集的最大文档数。max_docs_per_value 默认设置为 1。

当 选择 fieldscript 后,在同一个文档中产生了多个值,聚合会抛出一个错误(由于效率问题,不支持使用多值字段进行重复数据删除)。

示例:

我们可能很想看看在 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 聚合下,因为这丢弃了分数。在这种情况下,将引发错误。

数据去重逻辑受限

数据去重逻辑仅适用于一个分片级别,因此不支持于分片之间。

没有为 地理位置/日期 提供专门的语法

目前定义多样化值的语法由 fieldscript 决定,因此没有添加语法糖来表达地理位置或日期单位,例如 “7d”(七天)。这种支持可能会在以后的版本中添加,用户当前必须使用 script 来创建这些类型的值。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
CrazyZard
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~