我的文件'结构看起来像这样:
{
"element": "A",
"date": "2014-01-01",
"valid_until": "2014-02-01"
},
{
"element": "A",
"date": "2014-02-01",
"valid_until": "9999-12-31"
}
日期" 9999-12-31"在这里说:"它还没有过期"。总是存在这样的范围,因此对于给定的元素" A",date> valid_until永远不会重叠。因此,我可以通过使用这样的伪代码来计算我有多少元素:COUNT个元素WHERE date< date_to_count AND valid_until> = date_to_count
where" date_to_count"是我想要计算值的日期。由于我想在几个时间点计算这个,我可以使用日期直方图或日期范围聚合。但是,日期范围似乎只适用于某种字段。理想情况下,我希望能够做到这一点:
"aggs": {
"foo": {
"date_range": {
"fields": ["date", "valid_until"],
"ranges": [
{"from": "2014-01-01", "to": {"2014-02-01"}},
{"from": "2014-02-01", "to": {"2014-03-01"}},
{"from": "2014-03-01", "to": {"2014-04-01"}}
]
}
}
}
" date"将用于"来自"和" valid_until"将被用于"到"。
我已经尝试了其他一些有关脚本的想法,但无法通过这种方式找到一种有效的方法:/。
我想我也可以解决这个问题,如果在一个脚本中,我可以访问当前的from / to值,但是我再一次尝试了像" ctx.to" ," context.to",但这些变量未定义。
谢谢!
答案 0 :(得分:0)
由于date_range
和date_histogram
聚合都适用于单个字段,因此我认为您无法通过聚合实现目标。但是,如果您没有太多需要查询的日期范围,则可以通过查询每个日期范围来调用count API。这看起来像这样:
"query": {
"filtered": {
"filter": {
"bool" {
"must": [
{ "range": { "date": { "gte": "2014-01-01" }}},
{ "range": { "valid_until": { "lt": "2014-02-01" }}}
]
}
}
}
}
答案 1 :(得分:0)
我遇到了同样的问题,并希望通过使用一个查询来解决这个问题。以下是适用于Elasticsearch 5.2的解决方案
"aggs": {
"range1": {
"date_range": {
"fields": "date",
"ranges": [
{"from": "2014-01-01", "to": {"2014-02-01"}},
{"from": "2014-02-01", "to": {"2014-03-01"}},
{"from": "2014-03-01", "to": {"2014-04-01"}}
]
},
"range2": {
"date_range": {
"field": "valid_until",
"ranges": [
{"from": "2014-01-01", "to": {"2014-02-01"}},
{"from": "2014-02-01", "to": {"2014-03-01"}},
{"from": "2014-03-01", "to": {"2014-04-01"}}
]
}
}
}