跳到主要内容

采样器聚合 sampler

Sampler Aggregation

一种 filtering aggregation 用于将任何子聚合的处理限制为得分最高的文档样本。

示例用例:

  • 将分析的重点集中在高相关性匹配上,而不是低质量匹配的潜在长尾
  • 降低聚合的运行成本,这些聚合仅使用样本(例如significant_terms)即可产生有用的结果

例子:

查询StackOverflow数据中的流行术语javascript或罕见术语kibana将匹配许多文档,其中大多数缺少kibana一词。为了将significant_terms聚合集中在得分最高的文档上,这些文档更有可能匹配查询中最有趣的部分,我们使用了一个示例。

POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:kibana OR tags:javascript"
}
},
"aggs": {
"sample": {
"sampler": {
"shard_size": 200
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": ["kibana", "javascript"]
}
}
}
}
}
}

返回

{
...
"aggregations": {
"sample": {
"doc_count": 200,
"keywords": {
"doc_count": 200,
"bg_count": 650,
"buckets": [
{
"key": "elasticsearch",
"doc_count": 150,
"score": 1.078125,
"bg_count": 200
},
{
"key": "logstash",
"doc_count": 50,
"score": 0.5625,
"bg_count": 50
}
]
}
}
}
}

如果没有sampler聚合,请求查询会考虑低质量匹配的完整“长尾”,因此识别不太重要的terms,如jquery和angular,而不是关注更具洞察力的Kibana-related terms。

POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:kibana OR tags:javascript"
}
},
"aggs": {
"low_quality_keywords": {
"significant_terms": {
"field": "tags",
"size": 3,
"exclude":["kibana", "javascript"]
}
}
}
}

返回

{
...
"aggregations": {
"low_quality_keywords": {
"doc_count": 600,
"bg_count": 650,
"buckets": [
{
"key": "angular",
"doc_count": 200,
"score": 0.02777,
"bg_count": 200
},
{
"key": "jquery",
"doc_count": 200,
"score": 0.02777,
"bg_count": 200
},
{
"key": "logstash",
"doc_count": 50,
"score": 0.0069,
"bg_count": 50
}
]
}
}
}

shard_size

shard_size参数限制在每个shard上处理的样本中收集多少得分最高的文档。默认值为100。

局限性

不能嵌套在breadth_first aggregations下

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