我的索引中包含以下样式的文档:
{
"docType": {
"valuesOverTime": [
{
"begin": 1488442858570,
"end": 1488442860570,
"values": [
{
"name": "level",
"segCount": 4
}
]
},
{
"begin": 1488442860571,
"end": 1488442890592,
"mcdn": [
{
"name": "level",
"segCount": 10
}
]
},
{
"begin": 1488442890593,
"end": 1488442890600,
"mcdn": [
{
"name": "level",
"segCount": 7
}
]
}
]
}
}
并且想要在特定时间范围内查询docType.valuesOverTime.values.segCount的总和,如下面的范围
{
"range": {
"docType.valuesOverTime.begin": {
"gte": 1488442858570,
"lte": 1488442860571
}
}
},
{
"range": {
"docType.valuesOverTime.end": {
"gte": 1488442860570,
"lte": 1488442890592
}
}
}
应该得到前两个条目的总和:14。
但是我绝对不能正确查询!在这种情况下,我总是得到docType.valueOverTime.values.segCount中所有条目的总和为21。
我尝试了以下查询及其中的一些变体,当然这些都是错误的:
{
"size": 0,
"aggs": {
"myfilter": {
"filter": {
"bool": {
"must": [
{
"range": {
"docType.valuesOverTime.begin": {
"gte": 1488442858570,
"lte": 1488442860571
}
}
},
{
"range": {
"docType.valuesOverTime.end": {
"gte": 1488442860570,
"lte": 1488442890592
}
}
}
]
}
},
"aggs": {
"summe": {
"sum": {
"field": "docType.valuesOverTime.values.segCount"
}
}
}
}
}
}
和
{
"_source": "docType.valuesOverTime.values",
"query": {
"constant_score" : {
"filter" : {
"bool": {
"must": [
{
"range": {
"docType.valuesOverTime.begin": {
"gte": 1488442858570,
"lte": 1488442860571
}
}
},
{
"range": {
"docType.valuesOverTime.end": {
"gte": 1488442860570,
"lte": 1488442890592
}
}
}
]
}
}
}
},
"aggs": {
"summe": {
"sum": {
"field": "docType.valuesOverTime.values.segCount"
}
}
}
}
有人可以告诉我,我错了吗?以及如何正确行事!
使用以下映射
处理es 5.2.2"valuesOverTime": {
"properties": {
"begin": {
"type": "long"
},
"end": {
"type": "long"
},
"values": {
"properties": {
"name": {
"type": "keyword"
},
"segCount": {
"type": "long"
}
}
}
}
}
答案 0 :(得分:0)
我自己解决了这个问题:
首先,valuesOverTime中的所有内容都需要嵌套,以便映射看起来像
"valuesOverTime": {
"type": nested"
"properties": {
"begin": {
"type": "long"
},
"end": {
"type": "long"
},
"values": {
"properties": {
"name": {
"type": "keyword"
},
"segCount": {
"type": "long"
}
}
}
}
}
然后我可以查询如下:
{
"size": 0,
"aggs": {
"nestedAcq": {
"nested": {"path": "docType.valuesOverTime"},
"aggs": {
"rangeAcq": {
"range": {
"field": "ocType.valuesOverTime.begin",
"ranges": [
{
"from": 1488442858570,
"to": 1488442860572
}
]
},
"aggs": {
"theSum": {
"sum": {
"field": "docType.valuesOverTime.values.segCount"
}
}
}
}
}
}
}
}
并获取
"theSum": {
"value": 14
}