示例中我们通过自定义的方式自己实现了一个和bm25等效的公式.
expression可以写任何公式, 在公式中可以直接引用下列预设变量, 在运行时会替换为实际值:
idf
boost
tf
dl
avgdl..., 所以如果我们不考虑自定义dl的计算方法, 实际上Similarity是完全可以在Query阶段随意修改的....* 需要注意是, lucene在索引阶段已调用字段对应similarity的computeNorm()方法计算了norm并储存起来....其实核心问题就是, 怎么获取到需要的tf, idf等需要的特征值呢?..., 很容易的拿到了所有需要的属性的值:
图片
最后的Exp4jUtil, 是我们自己封装的执行表达式的库, 基于exp4j项目: https://github.com/fasseg/exp4j.