在上一篇文章的基础上,其实 Elasticsearch 从 2.0 以后,还新增了另一种聚合方式,叫 sampler。这个聚合的作用,是在每个分片上,只采样部分文档出来继续后续统计。

比如把上一篇的查询改成这样:

#!/bin/bash
curl -XPOST 'localhost:9200/logstash-2016.07.18/logs/_search?pretty&terminate_after=10000&size=0' -d '
{
    "aggs": {
        "group": {
            "terms": {
                "field": "result.punct"
            },
            "aggs": {
                "sample": {
                    "sampler": {
                         "shard_size": 200
                     },
                    "aggs": {
                        "keyword": {
                            "significant_terms": {
                                "size": 1,
                                "field": "result._raw"
                            },
                            "aggs": {
                                "hit": {
                                    "top_hits": {
                                        "_source": {
                                            "include": [ "result._raw" ]
                                        },
                                        "size":1
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
'

当然,在这个 raw 日志的情况下,取样意义不是特别到,因为有 terminate_after 在,采样本身不会绝对随机。但是对其他 doc_values 的字段,采样就有意义了。