基於 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 字串,索引結果一致。不同編碼來源檔案經正確轉碼後,產生的索引應相同(待進一步驗證)。