Solr 5,
上一篇介绍了查询的难点,以及 Solr 中多种多样的查询方式。
当用户查询后,他们自然希望在第一页就找到想要的。
Solr 用评分机制来完成这一问题。
默认情况下使用 DefaultSimilarity类,来计算评分,你也可以配置其他 Similar 类来完成。
这个公式是不是让人绝倒?
Term frequency
Term 在某一 document 中出现的次数。
Inverse document frequency
Term 在多少个 document 中出现。
term.getBoost()
查询时,为 term 设置的权重,title:(solr)^2.5
norm = d.getBoost() * lengthNorm(f) * f.getBoost()
可以为 field 设置权重,当同名 field 出现多次,则 getBoost 各个权重的积。
也可以为 document 设置权重,相当于给 document 中每个 field 设置相同的权重。
最后, lengthNorm ,
当一个 term 在一段 200字 的文章中出现 5 次,和 term 在 20000 字的文章中出现 5 次。
不应该获得相同的评分。
而 lengthNorm 就是为了这个而存在的参数。
其实上面这些都比较玄,这个公式太复杂了,让我们看一个简单的模型。
我按步骤来分析,在这个简单模型下,是如何计算文档的相关度。
1. 根据分词器的词典,可能会得到 n 个 term。
因为 term 就是最细的划分了,所以每个 term 可以作为一个基。
n 个 term 就建立一个 n 维向量空间。
2. 将查询表达式按这个基展开。
2. 将两个(当然也可以是多个)待比较的 document 按这组基展开。
3. 相似度的公式是 cos = 向量的积 除以 向量模的乘积。
举个实际的例子
查询表达式 he (默认field)
Document1
默认field
field value: he
Document2
默认 field
field value: he she
基:he she
表达式向量:0*he + 1*she
向量d1: 0*he + 1*she
向量d2::1*he + 1*she
d1相关度: (0+1)/(1*1) =1
d2相关度:(1+1)/(1*2^0.5) = 1/2^0.5
尽管这个模型很简单,但 Solr 的模型够复杂,所以目前我还控制不了相关性。。。