相關度排序

相關度排序

1.1 什麼是相關度排序

相關度排序是查詢結果按照與查詢關鍵字的相關性進行排序,越相關的越靠前。比如搜索Lucene”關鍵字,與該關鍵字最相關的文章應該排在前邊。

 1.2 相關度打分

Lucene對查詢關鍵字和索引文檔的相關度進行打分,得分高的就排在前邊。如何打分呢?Lucene是在用戶進行檢索時實時根據搜索的關鍵字計算出來的,分兩步:

1計算出詞(Term)的權重

2根據詞的權重值,計算文檔相關度得分。

 什麼是詞的權重?

通過索引部分的學習,明確索引的最小單位是一個Term(索引詞典中的一個詞),搜索也是要從Term中搜索,再根據Term找到文檔,Term對文檔的重要性稱爲權重,影響Term權重有兩個因素:

Term Frequency (tf)

指此Term在此文檔中出現了多少次。tf越大說明越重要。

(Term)在文檔中出現的次數越多,說明此詞(Term)對該文檔越重要,如“Lucene”這個詞,在文檔中出現的次數很多,說明該文檔主要就是講Lucene技術的。

 Document Frequency (df)

指有多少文檔包含次Termdf越大說明越不重要。

比如,在一篇英語文檔中,this出現的次數更多,就說明越重要嗎?不是的,有越多的文檔包含此詞(Term),說明此詞(Term)太普通,不足以區分這些文檔,因而重要性越低。

1.3 設置boost值影響相關度排序

boost是一個加權值(默認加權值爲1.0f),它可以影響權重的計算。

 l 在索引時對某個文檔中的field設置加權值高,在搜索時匹配到這個文檔就可能排在前邊。

l 在搜索時對某個域進行加權,在進行組合域查詢時,匹配到加權值高的域最後計算的相關度得分就高。

 設置boost是給域field)或者Document設置的。

1.3.1 在創建索引時設置

如果希望某些文檔更重要,當此文檔中包含所要查詢的詞則應該得分較高,這樣相關度排序可以排在前邊,可以在創建索引時設定文檔中某些域(Field)的boost值來實現,如果不進行設定,則Field Boost默認爲1.0f一旦設定,除非刪除此文檔,否則無法改變

 1.3.1.1 代碼實現

@Test

public void setBoost4createIndex()throws Exception {

// 創建分詞器

Analyzer analyzer = new StandardAnalyzer();

 IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3,

analyzer);

Directory directory = FSDirectory.open(new File("E:\\11-index\\0728"));

// 創建IndexWriter對象,通過它把分好的詞寫到索引庫中

IndexWriter writer = new IndexWriter(directory, cfg);

 Document doc = new Document();

Field id = new StringField("id","11", Store.YES);

Field description = new TextField("description","測試設置BOOSTlucene",

Store.YES);

// 設置boost

description.setBoost(10.0f);

// 把域添加到文檔中

doc.add(id);

doc.add(description);

writer.addDocument(doc);

// 關閉IndexWriter

writer.close();

}

 1.3.1.2 輸出


 1.3.2 在查詢索引時設置

MultiFieldQueryParser創建時設置boost


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章