首先,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。