1 相關度排序
1.1 什麼是相關度排序
相關度排序是查詢結果按照與查詢關鍵字的相關性進行排序,越相關的越靠前。比如搜索“Lucene”關鍵字,與該關鍵字最相關的文章應該排在前邊。
1.2 相關度打分
Lucene對查詢關鍵字和索引文檔的相關度進行打分,得分高的就排在前邊。如何打分呢?Lucene是在用戶進行檢索時實時根據搜索的關鍵字計算出來的,分兩步:
1)計算出詞(Term)的權重
2)根據詞的權重值,計算文檔相關度得分。
什麼是詞的權重?
通過索引部分的學習,明確索引的最小單位是一個Term(索引詞典中的一個詞),搜索也是要從Term中搜索,再根據Term找到文檔,Term對文檔的重要性稱爲權重,影響Term權重有兩個因素:
l Term Frequency (tf):
指此Term在此文檔中出現了多少次。tf越大說明越重要。
詞(Term)在文檔中出現的次數越多,說明此詞(Term)對該文檔越重要,如“Lucene”這個詞,在文檔中出現的次數很多,說明該文檔主要就是講Lucene技術的。
l Document Frequency (df):
指有多少文檔包含次Term。df越大說明越不重要。
比如,在一篇英語文檔中,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","測試設置BOOST值lucene", 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值。