相關度指兩個事物之間的關聯關係(相關性). Lucene中指的是搜索關鍵詞(Term)與搜索結果之間的相關性. 如: 搜索bookname域中包含java的圖書, 則根據java在bookname中出現的次數和位置來判斷結果的相關性. ...
目錄
1 什麼是相關度
概念: 相關度指兩個事物之間的關聯關係(相關性). Lucene中指的是搜索關鍵詞(Term)與搜索結果之間的相關性. 如: 搜索bookname域中包含java的圖書, 則根據java在bookname中出現的次數和位置來判斷結果的相關性.
2 相關度評分
Lucene對查詢關鍵字和索引文檔的相關度進行打分, 得分越高排序越靠前.
- Lucene的打分方法: Lucene在用戶進行檢索時根據實時搜索的關鍵字計算分值, 分兩步:
- 計算出詞(Term)的權重
- 根據詞的權重值, 計算文檔相關度得分.
什麼是詞的權重?
通過索引部分的說明, 易知索引的最小單位是Term(索引詞典中的一個詞). 搜索也是從索引域中查詢Term, 再根據Term找到文檔. Term對文檔的重要性稱為Term的權重.
影響Term權重的因素有兩個:
Term Frequency(tf):
指此Term在此文檔中出現了多少次. tf 越大說明越重要.
詞(Term)在文檔中出現的次數越多, 說明此詞(Term)對該文檔越重要, 如"Lucene"這個詞, 在文檔中出現的次數很多, 說明該文檔可能就是講Lucene技術的.
Document Frequency(df):
指有多少文檔包含此Term. df 越大說明越不重要.
如: 在某篇英文文檔中, this出現的次數很多, 能說明this重要嗎? 不是的, 有越多的文檔包含此詞(Term), 說明此詞(Term)越普通, 不足以區分這些文檔, 因而重要性越低.
3 相關度設置
Lucene通過設置關鍵詞Term的權重(boost)值, 影響相關度評分, 從而影響搜索結果的排序.
3.1 需求
出版社做了廣告推廣: Lucene在收到錢之後, 將《Lucene Java精華版》排到第一.
3.2 廣告設置中......
/**
* 相關度排序, 通過修改索引庫的方式, 修改需要更改的圖書的權重
*/
@Test
public void updateIndexBoost() throws IOException {
// 1.建立分析器對象(Analyzer), 用於分詞
Analyzer analyzer = new IKAnalyzer();
// 2.建立索引庫配置對象(IndexWriterConfig), 配置索引庫
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);
// 3.建立索引庫目錄對象(Directory),指定索引庫位置
Directory directory = FSDirectory.open(new File("/Users/healchow/Documents/index"));
// 4.建立索引庫操作對象(IndexWriter), 操作索引庫
IndexWriter writer = new IndexWriter(directory,iwc);
// 5.建立文檔對象(Document)
Document doc = new Document();
// 5 Lucene Java精華版 80 5.jpg
doc.add(new StringField("bookId", "5", Store.YES));
TextField nameField = new TextField("bookName", "Lucene Java精華版", Store.YES);
// 設置權重值為100. 預設是1
nameField.setBoost(100f);
doc.add(nameField);
doc.add(new FloatField("bookPrice", 80f, Store.YES));
doc.add(new StoredField("bookPic","5.jpg"));
// 6.建立更新條件對象(Term)
Term term = new Term("bookId", "5");
// 7.使用IndexWriter對象,執行更新
writer.updateDocument(term, doc);
// 8.釋放資源
writer.close();
}
// 或在創建索引時即修改權重:
// 打個廣告: 收到錢之後, 將《Lucene Java精華版》排到第一
// 5 Lucene Java精華版 80 5.jpg
TestField bookNameField = new TextField("bookName", book.getBookname(), Store.YES);
if (book.getId() == 5) {
// 設置權重值為100. 預設是1
bookNameField.setBoost(100f);
}
document.add(bookNameField);
版權聲明
作者: ma_shoufeng(馬瘦風)
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段聲明, 且在文章頁面明顯位置給出原文鏈接, 否則博主保留追究法律責任的權利.