elasticsearch minimum buckets count

时间:2017-07-20 13:59:35

标签: elasticsearch

我希望在聚合中得到结果,其中buckets.length(桶的数量/数量)具有最小计数,类似于在SQL中使用HAVING。

(在此特定场景中至少访问了5天的网站访问者。)

我的一部分查询:

"aggs": {
    "site_visitors": {
        "aggs": {
            "users": {
                "terms": {
                    "field": "user_id",
                    "size": 0
                },
                "aggs": {
                    "daily_counts": {
                        "date_histogram": {
                            "field": "timestamp",
                            "interval": "1d"
                        }
                    }
                }
            }
        }
    }
}

这里我们有一个包含5个结果的桶(buckets.length)。大多数存储桶不会有5个或更多结果,我不想要所有这些。

{
     "key": 123456,
     "doc_count": 10,
     "days_count": {
        "buckets": [
             {
                "key_as_string": "2017-04-05T00:00:00.000Z",
                "key": 1491350400000,
                "doc_count": 2
             },
             {
                "key_as_string": "2017-04-22T00:00:00.000Z",
                "key": 1492819200000,
                "doc_count": 1
             },
             {
                "key_as_string": "2017-04-25T00:00:00.000Z",
                "key": 1493078400000,
                "doc_count": 4
             },
             {
                "key_as_string": "2017-04-30T00:00:00.000Z",
                "key": 1493510400000,
                "doc_count": 2
             },
             {
                "key_as_string": "2017-05-04T00:00:00.000Z",
                "key": 1493856000000,
                "doc_count": 1
             }
        ]
     }
}

我希望每个存储桶中只有至少5个结果或更多(例如:gte)的结果 - 不是doc_count,而是buckets.length。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您可以在"min_doc_count": 5聚合中添加date_histogram参数。

"aggs": {
    "site_visitors": {
        "aggs": {
            "users": {
                "terms": {
                    "field": "user_id",
                    "size": 0
                },
                "aggs": {
                    "daily_counts": {
                        "date_histogram": {
                            "field": "timestamp",
                            "interval": "1d"
                        }
                    },
                    "min_5_buckets_selector": {
                        "bucket_selector": {
                           "buckets_path": {
                              "count": "daily_counts._bucket_count" 
                           },
                           "script": {
                              "inline": "params.count >= 5"
                           }
                        }
                    }
                }
            }
        }
    }
}