有没有办法简化和优化以下查询:
{
"query": {
"filtered": {
"filter": {
"and": [
{
"range": {
"ts": {
"gte": "2014-12-18",
"lte": "2014-12-18"
}
}
}
]
},
"query": {
"match": {
"track_events.event": "render"
}
}
}
},
"aggs": {
"per_type": {
"terms": {
"field": "type",
"order": {
"_count": "desc"
},
"size": 0
},
"aggs": {
"per_hour": {
"terms": {
"script": "(doc[\"track_events.ts\"].value - doc[\"ts\"].value)/(1000 * 3600)",
"order": {
"_count": "desc"
},
"size": 0
}
}
}
}
}
}
elasticsearch中的索引包含包含字段track_events.ts
和ts
的文档。目的是计算track_events.ts
和ts
之间每小时间隔内存在的出现次数。
回复示例:
"buckets": [{
"key": "0",
"doc_count": 67736997
},
{
"key": "1",
"doc_count": 7193214
},
{
"key": "2",
"doc_count": 3406966
},
{
"key": "3",
"doc_count": 1988135
}]
}
表示67736997
计算的时间差小于1小时,7193214
计算时差小于2小时等等。
答案 0 :(得分:0)
最大的性能提升是替换脚本。
即。而不是做:
(doc[\"track_events.ts\"].value - doc[\"ts\"].value)/(1000 * 3600)
在将数据加载到Elasticsearch并将其放入另一个字段时预先计算此值。然后在此字段上执行术语聚合。