2012-11-02 52 views
1

Solr/Lucene相當新穎。我有一個簡單的要求,不知道是否很容易配置solr來做到這一點。solr/lucene按文本匹配百分比計分?

假設所有文檔只有一個文本字段,而不是標記。

當一個查詢進來時,我想按照文本百分比匹配結果進行排序(包含)。百分比由len(query)/len(matched text field)

例如計算,有三個文件,文本字段下面:
DOC1:ABCDEFGHIJ
DOC2:ABCDEFGH
3:ABC

如果搜索詞是 'CDE' ,文檔1和文檔2匹配(文本字段包含搜索詞)。 爲文檔1中,百分比匹配= 3/10 = 30%
爲DOC 2,百分比匹配= 3/8 = 37.5%

所以結果應該是:
DOC2
DOC1

確實這有意義嗎?如何使用solr實現它?

謝謝。

回答

3

您可以重寫Lucene評分。

擴展org.apache.lucene.search.DefaultSimilarity,定義您的自定義評分算法。

很多DefaultSimilarity的方法可能只是存根,就像idf(只返回1)一樣,所以更復雜的評分元素不會影響結果。

然後在你的schema.xml中添加一行Solr中,將其配置爲使用你的得分類,如:

<similarity class="com.mycompany.MySimilarity" /> 

這裏的一些信息的頁面上的得分作品,點擊這裏:Lucene Scoring。有些資源還增加了自定義功能,這可能有助於組合一個可用的Similarily類。不過,老實說,尤其是如果你是Lucene/Solr的新手,你可能會更好地獲得一些默認得分的經驗。它運行得非常好,並且通過拋出很多有價值的功能。

編輯:

注意,這提供了一個可能的(雖然不漂亮)的方式來實現相似。再往下看另一種方式。你仍然需要一個自定義的相似性,但它更簡單。

好的,這裏是刺傷它。我沒有對它進行測試(目前還沒有真正做到這一點),但也許它會指向你正確的方向。

可能最簡單的方法就是爲每個字段存儲一個規範,以編碼該術語的長度。爲此,請重寫computeNorm,並返回從第二個參數中取出的長度的倒數。

爲了計算您指定的精確評分,您需要訪問匹配的查詢詞或長度。兩者都不是很容易。您可能會找到一種方法,或者您可以手動將該值傳遞到相似性類。由於您只需要按照您指定的順序獲取數值,另一種表述您的需求的方法是「按照從最短到最長的順序排列」。我們已經用computeNorm完成了這一點。

然後你只需踩滅了休息,造成這些方針的東西:

float computeNorm(String field, FieldInvertState state) { 
    int length = state.getOffset() - state.getPosition(); 
    return 1.0/(float)length; 
} 
float coord(int overlap, int maxOverlap) { 
    return 1; 
} 
float idf(int docFreq, int numDocs) { 
    return 1; 
} 
float tf(float freq) { 
    return 1; 
} 
float queryNorm(float sumOfSquaredWeights) { 
    return 1; 
} 
float sloppyFreq(int distance) { 
    return 1; 
} 
float lengthNorm(string fieldName, int numTerms) { 
    return 1; 
} 

注:標準計算,當文檔被索引,所以插入文檔時爲它是必須使用這種相似性有效。查詢時間太遲而無法設定標準。由於壓縮,這也是非常近似的。

更簡單的方法(可能):

你知道,現在,我想它,因爲相同的順序由只是排序最短到最長的收購,你可以這樣做沒有新的相似性類別的複雜性。 當你添加文檔時,你可以應用一個字段級的提升來完成同樣的事情。只需將這些術語按1 /長度或一些類似的方法提高即可。

如果插入abcde,則將1/5的提升應用於該字段。

這樣做後,你甚至可以查詢'term:abc *^3',這將允許你得到你之前指出的百分比分數(同樣的效果也是一樣的,只有一個查詢術語)。

我認爲你應該能夠在你的CustomSimilarity中存儲所有的東西,如果你使用這樣的提升得分。在這種情況下,'idf'和'tf'可能都是你真正需要擔心的重寫。

+0

您是否可以添加更多關於用戶如何通過重寫相似類來處理特定問題的信息? – Jayendra

+0

@femtoRgon,感謝您的回覆。是否有任何示例顯示如何覆蓋評分?是的,我完全明白默認評分工作得很好。這是一個項目的業務需求,我想看看Solr是否可以解決這個問題。 – Henry

+0

感謝您的出色想法!會嘗試一下。 – Henry