我有以下查询,其中我每月获取最近3年的数据,我还获取其中存在数据的月数(存储桶)。以下是我的查询:
result = ERROR: No files found with the specified search criteria.
但是,现在我只想拥有存储桶数大于30的那些date_histograms。在ElasticSearch中可以吗?如果是,那怎么办?
上面的查询给我以下结果:
result =
我只希望“ count_buckets”中“ count”大于30的那些桶。
答案 0 :(得分:2)
如果我的理解正确,您要尝试的是根据count_buckets.count
值对存储桶进行过滤。如果date_histogram
创建的存储桶数大于30
,则应保留存储桶(针对compId
),否则应将其排除。换句话说,您要根据条件选择存储桶。为此,您已经添加了stats_bucket
聚合来获取存储桶数。现在,它可以用作bucket selector aggregation的参数。桶选择器聚合完全可以满足要求。
只需将bucket_selector
聚合添加到您的查询中,如下所示:
{
"size": 0,
"query": {
"bool": {
"filter": {
"terms": {
"compId": [
111,
112
]
}
},
"must": {
"range": {
"dateCreated": {
"from": "2016-04-01",
"to": "2019-03-31",
"format": "yyyy-MM-dd"
}
}
}
}
},
"aggs": {
"grp_company": {
"terms": {
"field": "compId"
},
"aggs": {
"data_per_month": {
"date_histogram": {
"field": "dateCreated",
"interval": "month"
}
},
"count_buckets": {
"stats_bucket": {
"buckets_path": "data_per_month._count"
}
},
"bucket_filter": {
"bucket_selector": {
"buckets_path": {
"bucket_count": "count_buckets.count"
},
"script": "params.bucket_count > 30"
}
}
}
}
}
}
答案 1 :(得分:1)
是的,您可以根据需要在词汇聚合中使用min_doc_count
参数(值30)。 min_doc_count
是获得这样结果的最有效方法。即使在这种情况下,您也不需要使用count_buckets,也可以使用同一聚合,请遵循以下代码:
...
...
"aggs": {
"grp_company": {
"terms": {
"field": "compId",
"min_doc_count": 30
},
"aggs": {
"data_per_month": {
"date_histogram": {
"field": "dateCreated",
"interval": "month"
}
},
"count_buckets": {
"stats_bucket": { --> I am getting the count of buckets here
"buckets_path": "data_per_month._count"
}
}
}
}
}
上面的汇总将仅返回在30个匹配中找到的那些存储桶。默认值为1。
为进一步了解您可以在这里阅读Elastic Official文档:min_doc_count Setting
希望这会对您有所帮助。