elasticsearch range查询非常慢

有一张大表,mapping设置如下:
{"properties":{
"deviceType":{"type": "keyword"},
"id":{"type": "keyword"},
"lastUseTime":{"type": "date"}
}}
lastUseTime时间字段精确到秒,有上百亿条数据。
查询串如下所示:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"filter": [{
"terms": {
"id": [
"4025925627025678"
],
"boost": 1.0
}
}, {
"term": {
"deviceType": {
"value": "IMEI",
"boost": 1.0
}
}
}, {
"range": {
"lastUseTime": {
"from": "2017-06-15 08:38:14",
"to": "2017-09-18 17:30:15",
"include_lower": true,
"include_upper": true,
"time_zone": " 08:00",
"format": "yyyy-MM-dd HH:mm:ss",
"boost": 1.0
}
}
}],
"disable_coord": false,
"adjust_pure_negative": true,
"boost": 1.0
}
},
"sort": [{
"useCount": {
"order": "desc"
}
}]
}
查询串中的时间区间包含的数据量可能有上十亿条,其他两个条件组合过滤后的数据量只有几十条,如果不加时间区间range查询,这个查询执行非常快,但是加上时间区间range查询的话,查询非常慢,甚至超时异常。
原本期望es先执行前两个filter,最后执行时间区间rang filter,但是看起来es总是会优先执行rang filter,即使把rang放在post_filter中。
请问有什么好的优化方法?
已邀请:

laoyang360 - 博客:blog.csdn.net/laoyang360 微信公众号:铭毅天下

赞同来自:

加上 _source限制输出试试
还有,三个条件的组合应该比两个少或者相等才对,仔细核对下逻辑。

whyne

赞同来自:

写入数据的时候,应该把时间类型设置为long的,写入前转换后再写入;
long类型的 范围查询应该很快的;
日期类型的范围查询,es也是要先转成long类型再匹配过滤的;
多了个转换的步骤,而且是所有记录!
所以 会慢很多;。。
我猜的,可以测试下;

Cheetah

赞同来自:

post_filter是过滤,是对当前结果的过滤,这个应该是很快的
如果全是filter,执行是并行的,不存在先后,是filter结果做交集
可以试试andfilter,andfilter是按顺序来的

要回复问题请先登录注册