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

