值在范围内的文档的 Elasticsearch 计数

Elasticsearch count of documents with values in range

我有一组文档,每个文档都有最小和最大数字字段,例如

{ min: 50, max: 100 },
{ min: 75, max: 125 },
{ min: 75, max: 150 },
...

我事先知道可能的最大值是多少。我想要做的是一个存储桶聚合,用于计算存储桶值包含在文档的最小值和最大值之间(在本示例中假设包含在内)的文档数量。例如,如果我有带键的桶

60, 80, 100, 120, 140, 160

我想找回 doc_counts 的(分别):

1, 3, 3, 2, 1, 0

我觉得使用脚本进行范围聚合让我很接近,但我不确定如何到达那里。也许我需要一个子聚合?

您需要一个 filters 聚合,其中每个键对应一个单独的过滤器。这是两个键的示例

{
    "aggs": {
        "ranges": {
            "filters": {
                "filters": {
                    "60": {
                        "bool": {
                            "must": [
                                {
                                    "range": {
                                        "min": {
                                            "gte": 60.0
                                        }
                                    }
                                },
                                {
                                    "range": {
                                        "max": {
                                            "lt": 60.0
                                        }
                                    }
                                }
                            ]
                        }
                    },
                    "80": {
                        "bool": {
                            "must": [
                                {
                                    "range": {
                                        "min": {
                                            "gte": 80.0
                                        }
                                    }
                                },
                                {
                                    "range": {
                                        "max": {
                                            "lt": 80.0
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    }
}

我认为没有更简单的方法,因为您的范围在单独字段中的文档中