1. 程式人生 > >驗證相關度排序是否受查詢的多個關鍵字在內容中相鄰緊密程度有關

驗證相關度排序是否受查詢的多個關鍵字在內容中相鄰緊密程度有關

程序 關鍵字 field

昨天給公司同事們介紹了lucene相關度打分的公式,大家提到了一個問題,總感覺用相關度排序的時候,lucene會把查詢關鍵字相鄰緊密的doc排在前面,但是打分公式裏面卻沒提到過這個因素,所以我現在來驗證下查詢詞的緊密程度是否會影響打分。

局部代碼

添加doc程序

1 設置lucene保存field的所有信息,包括詞位置, payloads等等

FieldType ty = new FieldType();
ty.setIndexed(true);
ty.setStored(true);
ty.setTokenized(true);
ty.setStoreTermVectors(true);
ty.setStoreTermVectorOffsets(true);

ty.setStoreTermVectorPositions(true);
ty.setStoreTermVectorPayloads(true);
IndexOptions value = IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS;
ty.setIndexOptions(value);

2 分詞器選擇單字分詞, 每document只有一個單field

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_48);

Document doc = new Document();
Field f = null;

f = new Field("content", valueString, ty);
doc.add(f);

查詢doc程序

查詢內容也采用單字分詞

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_48);

QueryParser parser = new QueryParser(Version.LUCENE_48, field, analyzer);

查詢排序選擇sort(),就是相關度排序

TopFieldDocs results = searcher.search(query, 1, new Sort());
ScoreDoc[] hits = results.scoreDocs;

==================================================

我會陸續插入幾篇包含“中”“國”這兩個字的doc,然後對“中國”進行查詢(分詞)

1 來驗證查詢的term在文中的絕對位置是否影響分數

我插入下面三篇內容,這三篇除了“中國”的位置不一樣,內容長度,tf,idf還有查詢詞的相鄰程度都是一樣的,避免其他因素影響排序

移動網上營業廳中國
移動網上中國營業廳
中國移動網上營業廳

查詢的結果如下,三篇的打分一樣,按在插入的順序排列

這說明查詢的term在文中的絕對位置不影響分數,分數一樣的doc會按在插入順序排序

doc hit : 3
content: 移動網上營業廳中國 | score : 0.314803
content: 移動網上中國營業廳 | score : 0.314803
content: 中國移動網上營業廳 | score : 0.314803

==================================================

2 來驗證查詢的term在文中相鄰程度是否影響分數

我再插入3篇內容,這三篇內容的查詢詞相鄰程度都不一樣

國移動網上營業廳中

國移動網中上營業廳

移動網中上國營業廳

查詢的結果如下,新的三篇和舊的三篇打分依舊一樣

這說明查詢的term在文中相鄰程度也不影響分數

doc hit : 6
content: 移動網上營業廳中國 | score : 0.37381613
content: 移動網上中國營業廳 | score : 0.37381613
content: 中國移動網上營業廳 | score : 0.37381613
content: 國移動網上營業廳中 | score : 0.37381613
content: 國移動網中上營業廳 | score : 0.37381613
content: 移動網中上國營業廳 | score : 0.37381613

ps:這次的doc分數雖然都相同,但是卻比上一次的要高一點,這是受idf變大的影響,idf的公式如下

idf(t) = 1 + log (
numDocs
––––––––– )
docFreq+1

numDocs是文章總個數,docFreq是包含查詢term的doc個數,因為測試裏面每篇doc都包含term,所以這兩個變量是一樣的,加入doc越多會導致log裏的值變大且無限逼近於1,idf就變大了,分數也就提高了

==================================================

3 來驗證查詢的term的tf和文章長度是否影響分數

我再插入2篇內容,這一篇內容的查詢詞tf高,一篇長度短,一篇長度短且tf高,其他還是一樣

國移動網中營業廳中

國移動營業廳中

國移動中業廳中

查詢結果如下,長度短且tf高的doc分數最高,查詢詞tf高和內容長度短的兩篇排下面,但是分數僅僅略微差別,排最後的是前面插入的6篇

doc hit : 9
content: 國移動中業廳中 | score : 0.5727169
content: 國移動網中營業廳中 | score : 0.47726405
content: 國移動營業廳中 | score : 0.47445422
content: 移動網上營業廳中國 | score : 0.3953785
content: 移動網上中國營業廳 | score : 0.3953785
content: 中國移動網上營業廳 | score : 0.3953785
content: 國移動網上營業廳中 | score : 0.3953785
content: 國移動網中上營業廳 | score : 0.3953785
content: 移動網中上國營業廳 | score : 0.3953785

結論

查詢詞的位置,緊密程度不影響打分

內容長度和tf值都會對分數有影響,但是這兩個因素沒絕對的優先級

同查詢條件下的對同一篇文章的分數不是一個定值,因為每個詞的IDF受全文檔數據的影響。


驗證相關度排序是否受查詢的多個關鍵字在內容中相鄰緊密程度有關