导航
导航

wildcardQuery引发的问题

预警反馈某服务cpu不时的短间隔内飙高,通过jvm定位到cpu消耗最高的线程,拉出堆栈信息分析问题代码。
排查发现是模糊查询的关键字导致,之前不知道是es的wildcardQuery问题,自以为是分词缘故导致饶了一些弯路,后来在segmentfault找到相似问题(感谢segmentfault,广告钱就不收了),遂找到原因。
输入的字符串长度没有做限制,首尾通配符中间可能是很长的一个字符串,导致的后果就是对应的wildcard Query执行非常慢,非常消耗CPU。
除了限制字数貌似也没有更好的解决办法,然后想起来百度搜索查询限制在38个汉字以内,心里想就平衡了 哈哈

探寻内部原因:
集网上多家之言总结一下,es的核心Lucene,Lucene4.0开始会将输入的字符串模式构建成一个DFA 而DFA对带有通配符的字符串操作开销很大。