solr 排序與文檔分數計算
solr
何為文檔?
solr是一個文檔存儲與檢索引擎,提交給solr處理的每一份數據都是一份文檔。在solr的schema文件中我們可以指定字段的名稱和類型,一個文檔我們通過定義schema,映射為特定類型的字段集合,文檔的每個字段都根據其字段類型進行內容分析,分析的結果保存在索引中,這樣在發起查詢的時候就能檢索到相關結果。
倒排索引:
在傳統的數據庫模型中,都是文檔映射至內容,而solr使用了索引將內容映射至文檔的方式。
模糊查詢機制:
當通配符搜索執行時,倒排索引中的所有詞項與第一個通配符之前的查詢詞部分進行匹配。接下來,檢查每個候選詞項是否與查詢中的通配符模式相匹配。
一般通配符前指定越多的詞查詢速度越快,如engineer*的執行花銷不大,但是e*執行花銷很大。在solr不建議用首位通配符,如*ing,這個會導致嚴重的性能問題。
默認相似度:
solr的相關度得分是基於similarity類的,默認的similarity實現及理論基礎如下:
它會去檢查詞項向量的余弦相似度,如果詞項向量的余弦相似度和文檔向量的余弦相似度更接近,那麽我們認為它們的相似度越高。
那麽如何用構造合理的向量來表征它們呢?
詞項頻次tf(term frequency):
我們認為一個查詢詞項在一個文檔中出現的越多,那麽我們認為它和這個文檔越相關。但是如果一個詞在文檔中出現10次,我們並不認為相關度應該提高10倍,所以這裏開了平方根來減少查詢詞項多次出現的額外加分。
反向文檔頻次idf(inverse document frequency):
一般來說在查詢匹配中我們認為較少見的詞比常見的詞有更好的區分度,它懲罰了在多個文檔中普遍出現的詞項。(感覺要視實際情況而定)
詞項權重:
在實際的搜索中我們不必完全依賴與solr去計算分數,根據我們的一些經驗我們可以自己去調節詞項的權重,以符合我們的預期。
規範化因子:
solr默認的相關度公式計算了三種規範化因子:字段規範、查詢規範和協調因子
(1)字段規範:
其中d.getBoost()為文檔的權重,
f.getBoost()表示字段權重
lengthNorm(f)表示長度歸一參數取值等於字段中詞項數量的平方根,目的是消除特定詞項在較長文檔中出現次數較多的優勢,
(2)查詢規範:
queryNorm應用於所有的文檔,它不會影響總體的相關性排序,它僅僅作為查詢之間進行比較時得分計算的規範化因子。
(3)協調因子:
它的作用是衡量每個文檔匹配的查詢數量,如果查詢詞項是4個詞,那麽如果4個詞全匹配到,則協調因子是4/4;匹配到3個,那麽協調因子是3/4,以此類推。
solr 排序與文檔分數計算