大量should(term)查询性能骤降

Elasticsearch | 作者 lingerchouzi | 发布于2018年11月08日 | 阅读数:214

1、需求背景:
es版本6.3.2。65个keyword类型字段,查询时只要有一个字段符合就算匹配。符合的字段越多,得分越高。取top 10。
 
2、实现方法:
65个should查询,每个should查询里都是constant_score封装的term查询。
 
3、产生问题:
65个should查询性能很差,200万的数据量查询耗时在130ms。测试发现,should个数少量时性能很高,10-20ms。当should个数从40个开始性能开始变差,should越多性能越差。通过profileAPI发现,大量耗时推挤在nex_doc模块。
 
4、尝试优化:
es官网有指出,查询字段越多,性能越差。尝试将65个字段的值存储到一个字段中(keyword类型,存储的是集合)。然后通过terms查询,性能有所改善,耗时在65ms。但是terms无法实现符合的字段越多,得分越高的场景。
 
望各位指点一下。感谢
已邀请:

laoyang360 - [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:blog.csdn.net/laoyang360

赞同来自:

从根上入手,考虑需求为啥要65个字段?
看看这里如何转化需求,进一步转化实现。
或者你把需求再细化的描述一下。

rochy - rochy_he@jointsky

赞同来自:

minhash 和 simhash 的对比,你可以使用汉明距离来进行判定
github 有对应的插件,比起你这样做 termQuery 要快多了;
插件地址:https://github.com/joway/elast ... lugin
 
如果你不想使用插件,你可以将 simhash 切割成多段,然后每一段使用 fuzzeQuery 来进行搜索
fuzzeQuery 可以设置 fuzziness 来决定容忍程度
 

要回复问题请先登录注册