首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Lucene.NET 3.0.0 中文索引與檢索實戰:SmartChineseAnalyzer 與編碼陷阱

     編輯:關於.NET

基於 Lucene.NET 3.0.0 Demo 改寫,引用 SmartChineseAnalyzer 處理中文分詞。初期發現英文檢索正常但中文失效,追查發現為檔案讀取編碼問題。

問題重現與定位

原始 FileDocument.Document(File f) 內部使用 FileReader(f) 未指定編碼,導致 UTF-8 檔案讀取錯誤。另存為 ANSI 後反而正常,確認為編碼不匹配。

修正讀取編碼

自行建構 InputStreamReader 指定 UTF-8(或 Unicode):

FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 或 "Unicode"
BufferedReader br = new BufferedReader(isr);
doc.add(new Field("contents", br));

修正後中文檢索恢復正常。

索引與檢索核心程式碼

// 索引
IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR),
    new SmartChineseAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);
indexDocs(writer, docDir);
writer.close();

// 檢索
Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_CURRENT);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in, "GBK")); // 主控台輸入編碼
// ... QueryParser + IndexSearcher 標準流程

推測與驗證

Lucene 索引過程與編碼無關,只要讀取時正確解碼為 Unicode 字串,索引結果一致。不同編碼來源檔案經正確轉碼後,產生的索引應相同(待進一步驗證)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved