Skip to main content

多样化采样器聚集 diversified_sampler

Diversified Sampler Aggregation

与sampler aggregation类似,这是一种 filtering aggregation,用于将任何子聚合的处理限制为得分最高的文档样本。diversified_sampler聚合增加了限制共享共同值(如“author”)的匹配数量的能力。

示例用例:

  • 将分析的重点集中在高相关性匹配上,而不是低质量匹配的潜在长尾
  • 通过确保不同来源内容的公平表示,消除分析中的偏见
  • 降低聚合的运行成本,这些聚合仅使用样本(例如significant_terms)即可产生有用的结果

字段或脚本设置的选择用于提供用于重复数据消除的值,max_docs_per_value设置控制在共享一个公共值的任何一个shard上收集的文档的最大数量。max_docs_per_value的默认设置为1。

如果选择字段或脚本为单个文档生成多个值,则聚合将引发错误(由于效率问题,不支持使用多值字段进行重复数据消除)。

例子:

我们可能想看看哪些标签与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
}
]
}
}
}
}
  1. 总共对151个文档进行了抽样.
  2. significant_terms聚合的结果不会因任何一位作者的怪癖而扭曲,因为我们要求样本中任何一位作家最多发表一篇文章

Scripted example:

在这种情况下,我们可能希望在字段值的组合上实现多样化。我们可以使用脚本生成标记字段中多个值的哈希,以确保我们没有由相同重复的标记组合组成的样本。

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参数限制在每个shard上处理的样本中收集多少得分最高的文档。默认值为100。

max_docs_per_value

max_docs_per_value是一个可选参数,它限制每次选择重复数据消除值时允许的文档数。默认设置为“1”。

execution_hint

可选的execution_int设置会影响用于重复数据消除的值的管理。在执行重复数据消除时,每个选项最多可在内存中保存shard_size值,但保存的值类型可按如下方式控制:

  • 直接保存字段值(map)
  • 保存Lucene索引确定的字段序号(global_ordinals)
  • 保存字段值的哈希值-可能发生哈希冲突(byteshash)

如果Lucene索引中有此信息,则默认设置为使用global_ordinals,如果没有,则返回到map。在某些情况下,bytes_hash设置可能会更快,但由于哈希冲突的可能性,在重复数据消除逻辑中引入了误报的可能性。请注意,如果执行提示不适用,Elasticsearch将忽略执行提示的选择,并且这些提示没有向后兼容性保证。

局限性

不能嵌套在breadth_first聚合下

作为一个基于质量的过滤器,diversified_sampler聚合需要访问为每个文档生成的相关性得分。因此,它不能嵌套在terms aggregation下,terms aggregation将collect_mode从默认depth_first模式切换为breadth_firs模式,因为这会丢弃分数。在这种情况下,将抛出错误。

有限的重复数据消除逻辑。

重复数据消除逻辑仅适用于shard级别,因此不会跨shard应用。

geo/date字段没有专门的语法

目前,定义多样化值的语法是通过选择字段或脚本来定义的-对于表示地理或日期单位,如“7d”(7天),没有添加语法糖。此支持可能会在以后的版本中添加,用户当前必须使用脚本创建这些类型的值。