欢迎投稿

今日深度:

Solr 5,

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 的模型够复杂,所以目前我还控制不了相关性。。。






www.htsjk.Com true http://www.htsjk.com/solr/37224.html NewsArticle Solr 5, 上一篇介绍了查询的难点,以及 Solr 中多种多样的查询方式。 当用户查询后,他们自然希望在第一页就找到想要的。 Solr 用评分机制来完成这一问题。 默认情况下使用 Default...
相关文章
    暂无相关文章
评论暂时关闭