前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义打分公式开源库调研

自定义打分公式开源库调研

原创
作者头像
叫我家宝
修改2023-05-08 11:17:11
3390
修改2023-05-08 11:17:11
举报
文章被收录于专栏:搜索引擎技术研讨

背景

策略上需要通过自定义expression动态调整文本相似度算法, 而文本相似度算法对每个匹配(match query)都调用一次, 假设一个request中有10个match query, 每个match query平均匹配10w个文档(我们假设的极端些), 那么一个request会调用打分公式100w次.

可见, 我们需要一款super fast的expression evaluator.

实验

给定bm25公式: expression=idf_boost_(k+1)_tf/(tf+k_((1-b)+b\*dl/avgdl)). 和一组固定的参数数值.

重复执行100w次, 对比各开源库的耗时.

构建(编译)和执行前都有预热.

实验结果

名称

构建(编译)时间(ms)

执行时间(ms)

github链接

java原生代码

3

exp4j

0.04ms

298

paralithic

0.22ms

3

parsii

0.06

79

结论

经过测试, 决定选用paralithic.

为什么paralithic和其他开源库会有如此大的性能差异呢? 因为这几个库中, 只有paralithic采用了动态字节码生成技术(通过ASM). 类似的技术也被用在ES的painless表达式执行.

对于上面的bm25公式, paralithic会动态编译生成下面的java class, 因此拥有接近原生java的执行速度.

当然也因此导致了paralithic构建时间最慢, 不过好在我们的文本相关性公式虽然可以动态调整, 但从算法角度, 肯定是可枚举的, 因此可以把构建(编译)结果缓存起来.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 实验
  • 实验结果
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档