solr:關於spell的優化效果

1、lucene裏邊,有三個算法去計算拼寫糾錯的類似度。 算法

一、Edit Distance(編輯距離) 測試

算法原理:從一個字符串A通過增刪改的步數,變成另一個字符串B,這個步數最少的時候,就是爲A與B以前的 編輯距離。 spa

二、jaro-winkler distance(基於編輯距離的修改) .net

算法原理:兩個給定字符串S1和S2的Jaro Distance爲: blog

 

image

  • m是匹配的字符數;
  • t是換位的數目

這種算法,減小了因爲字符匹配,而字符位置不一樣,而形成的影響。 排序


詳情參考 :http://blog.csdn.net/chaoswork/article/details/5489877 字符串

三、 Ngram 算法。 get

算法原理:簡單的 N元切分。例如,2元,將目標A字符串(假如爲 「測試字符串」),就能夠分爲 「測試」,「試字」,「字符」,「符串」。跟B字符串(「實測字符串」,分爲 「實測」,「測字」,「字符」,「符串」。)再比較兩個字符串list的的重合次數。 it

2、solr提供 的spell的默認糾錯功能,其實要結合業務的話,比較難。 io

默認的,糾錯功能是這個樣子的: 選取 一個或者多個的 solrspellchecker(根據不一樣的算法或者邏輯提供suggestions),而後,合併搜索結果,根據必定規則(默認的規則是先按 編輯距離 排序,再按hit目標的term的個數排序)進行suggestions排序。這樣的方法,並無 結合實際的業務,而實際的業務,每每要加入 query的 熱度的這個維度。這樣業務的東西要插進去的話,就會比較麻煩。選取最好最合適的插入方式,這個很關鍵,由於如何不選取到最合理的方式的話,極有可能會影響到其它的功能。

3、solr 中的spell的代碼邏輯


4、加入對spell修改的具體方法。

一、修改 類似度的算法,加入自定義的類似度算法。

二、修改SuggestWordSorceComparator的 比較方法(toCompare),

三、修改SuggestWord的score的值,這裏能夠修改 score 爲加入本身的業務打分與類似度打分的相加的最終值。 這樣子修改,不必定是合理的,可是應該是可行的。

四、修改spellCheckCollation中的internalRank(內部的排序順序),其是在SpellCheckCollator中的L125中掉做用了。這種狀況的修改,是基於spellCheckCollater的最後的將獲得的結果再一次調用solrindexSearcher。在這些搜索中,修改原來的termquery爲按命中後的打分排序,而不是hits的次數排序。可能要在spellCheckCollation中加入score,記錄打分,也可能不須要記錄打分,只須要順序,具體看業務。在 這個地方修改,加入業務打分,不必定是合理的,可是應該是可行的。


5、更具四中的4,深刻代碼層的修改

一、因爲是調用solrindexSearcher的再次搜索,而原先的solrindexSearcher有可能已是被修改過了,即已經加入了 業務的打分以後的排序,直接能夠獲得每次搜索的sorce,有可能已是在solrindexSearcher 中search以後的順序,已是加入了業務的打分以後的排序。可是,加入了業務打分以後的順序,在search以後獲得的response的實例裏邊,不必定要 results的加業務打分以後的打分 。只有當獲得了這些打分以後,纔可能纔可以在屢次搜索(針對糾錯結果集)中獲得分數排序。

二、能夠在SpellCheckCollator中的L114中的log中獲得maxAllSorce

若是要提供跟多的數據以便於業務的須要,這個 first result的的 lucenesorce+busniesssorce就要獲得才行

相關文章
相關標籤/搜索