陋室铭
永远也不要停下学习的脚步(大道至简至易)

 

首先,solr使用的是默认的评分机制,要搞明白lucene默认评分机制,需要首先了解一下lucene的查询对象。

1、termquery

2、boolean query

3、rangequery

其中最重要的是termquery。是lucene的最基本的原子查询。每个查询最后内部都转化为一个个的原子查询。

example:

TermQuery term = new TermQuery("text", "test");

TermQuery term = new TermQuery("title", "test");

记住,term query是针对指定域进行查询的。记住这一点有利于理解lengthNorm()

另外,需要明确一点,lucene会先用bool模型来拿到所有符合条件的document,再将q转化为多个should拼接的termquery去和符合条件的doc进行相似度计算。

 

lucene的打分公式如下:

score(q,d) =  queryNorm(q)  · coord(q,d)  · ∑ (  tf(t in d)  · idf(t)²  · t.getBoost()  · norm(t,d) ) (t in q) 

其中最后一部分求和解释一下:(是对每个termquery,计算其得分最后累加)

tf:对指定域的temquery,在dcoument中出现的次数。

idf:是term在所有文档出现的次数

t.getboost():对每个termquery都可以赋予一个boost

norm:d.getboost()*f.getboost()*lengthNorm(f)其中f是term指定的域

 

下面是简单获取score。注:条件q千万不要带默认的条件*:*,如果是*:*那么相当于条件都一样,score全为1.0。

 

posted on 2021-11-24 18:44  宏宇  阅读(631)  评论(0编辑  收藏  举报