elasticsearch functionScoreQuery scriptFunction效率问题


FunctionScoreQueryBuilder weightBuilders = QueryBuilders.functionScoreQuery(queryBuilders, ScoreFunctionBuilders.scriptFunction(script)).boostMode(CombineFunction.SUM);
通过脚本去重新计算得分后,查询时间由原先的500ms以内,升高到要10s样子,索引的文档数接近3000W,这个应该怎么优化,10s也太夸张了。
 
 
有大神指点吗?
已邀请:

kennywu76 - wood@Ctrip

赞同来自: laoyang360 kepmoving medcl famoss Xargin delecarnegie xianyu更多 »

首先要尽量避免使用scriptQuery,它可以灵活的实现各种打分逻辑,但是通常也会使得开发人员懒于去思考更精细的数据模型,去应用更高效的打分方式。 很多时候,打分脚本参考的数据可以预先计算好,作为字段索引起来,然后通过bool query增加过滤条件去boost,或者通过其他的function score: weight/field_value_factor/Decay functions 打分,达到类似的效果。
 
如果实在拗不过产品,要严格按照对方要求的打分逻辑打分,而不得不用scriptQuery,那么有以下优化手段:
  1. 使用rescore query来降低script score的成本, 即先用代价小的查询和打分缩小数据范围,得到top X的记录,然后通过rescore query做更精确的筛选和打分。参考: https://www.elastic.co/guide/e ... e-api
  2. 将打分逻辑编写成java plugin, 效率比直接用脚本打分快很多,参考 https://www.elastic.co/guide/e ... ripts

 
最后,在文档打分方面,很容易陷入一个误区,意图通过精妙的打分算法呈现给用户最精确的数据。 然而很多时候,这种努力是徒劳的。所谓的最佳匹配,通常是伪命题,不同的人有不同的理解。
 
读一读以下链接的文档会受到一些启发:
https://www.elastic.co/guide/e ... .html
 
吴军在《数学之美》这本书里,也阐述了类似的观点:
 

屏幕快照_2017-03-31_19.00_.40_.png

 

要回复问题请先登录注册