采样器(sampler)聚合

一种过滤聚合,用于将任何子聚合的处理限制在得分最高的文档样本中。

使用用例举例:

  • 将分析的焦点集中在高相关性匹配上,而不是低质量匹配的潜在长尾上
  • 降低聚合的运行成本,仅使用样本即可产生有用的结果,如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
                    }
                ]
            }
        }
    }
}

总共采样了200份文件。因此,执行嵌套的significant_terms聚合的成本是有限的,而不是无限的。

如果没有sampler聚合,请求查询会考虑低质量匹配的完整“长尾”,因此会识别不太重要的词项,如jqueryangular,而不是关注更有见地的与Kibana相关的词项。

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

局限性

不能嵌套在广度优先(breadth_first)聚合下

作为基于质量的过滤器,sampler聚合需要访问为每个文档产生的相关性分数。 因此,它不能嵌套在将collect_mode从默认的深度优先(depth_first)模式切换到广度优先(breadth_first)模式的terms聚合下,因为这会丢弃分数。 在这种情况下,将会抛出一个错误。