標籤:傳統 資料 文檔 執行 計算 相關度 solr png 如何
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 排序與文檔分數計算