range字符串查询性能问题

作者 steven123 | 发布于2018年09月27日 | 阅读数:164

目前单位在查询的时候发现性能下降了好多,
 

{"query":
{"bool":
{"must":
[{"bool":
{"should":
[{"range":
{"mo_time":{"from":"20180919000000","to":"20180920003000"}}}]}},
{"bool":
{"should":
[{"range":
{"msg_flag":{"gte":"00","lte":"ff"}}}]}}]}},
"_source":["mo_time","msg_idx"]}
 
上面加粗的就是导致性能下降的查询条件,
不知道各位在字符串range的时候有什么调优的办法?不胜感激!~
 
已邀请:

rochy - rochy_he@jointsky

赞同来自: steven123

msg_flag 看起来是一个有限的数据集合,如果是一些状态字段的话,推荐使用 termsQuery
关于更多细节,你可以参看下面的文章:https://elasticsearch.cn/article/446
 

kennywu76 - wood@Ctrip

赞同来自: steven123

字符串做 range查询需要先找出满足查询条件的字符串,然后变成所有这些字符串的terms查询。 当满足条件的字符串很多的时候,需要合并的倒排列表会非常多,慢是显而易见的。
 
看起来你这些字符串实质是代表的16进制数值? 如果是的话,你可以这么优化: 
在数据写入之前,在应用端将该字段内容转换为对应的整形数值,然后在mapping里定义为数值类型,如short,integer或者long, range查询速度会有很大提升。
 
这个优化的前提是ES版本必须是5.0以上的,最好是5.4+。

steven123

赞同来自:

谢谢二位,我试试,有结论第一时间反馈!~

要回复问题请先登录注册