最近項目中用到了Lucene.net和盤古分詞 ,用以支撐前台的搜索需求。
在使用過程中,發現刪除不太好用,具體表現在:使用IndexWriter.DeleteDocuments 指定術語(Term)進行刪除,在語句執行完后,文件並沒有被物理刪掉,而是生成了新的.CFS(索引文件)。但是在單元測試中使用IndexWriter.DeleteAll(),卻可以正常的刪除掉所有文檔。
經過多方查證和實驗,獲得了正確的方法:
1,如果不知道文檔(document)的序號(docNum),那就得使用術語(Term)進行文檔的指定刪除。大部分應用場景,應該都是基於術語刪除,原因是方便,不需要先查詢一遍。
2,使用術語刪除,就需要指定鍵值對:Field和Value。經過若干次嘗試,這個Field是需要被索引才能在刪除時使用的,在2.9.2.2中,就是 Field.Index.ANALYZED;這個Value,似乎使用哈希值和字符組合都不能湊效,最好是一個數值串。我的做法是,把唯一的值哈希成10進制數值形式再存儲,那么刪除就能成功。
3,在執行完所有的IndexWriter.DeleteDocuments操作后,最好是提交並優化一下,最后關閉 IndexWriter,刪除就生效了,像這樣:
try { this.UnLock(); writerFs = new IndexWriter(directory, new PanGuAnalyzer(), false, IndexWriter.MaxFieldLength.UNLIMITED); foreach (var item in items) { Term termID = new Term("ID", item.GetID()); writerFs.DeleteDocuments(termID); } writerFs.Commit(); writerFs.SetUseCompoundFile(true); writerFs.Optimize(); } catch (IOException ex) { Logger.Error(typeof(SearchService), ex); } finally { try { if (writerFs != null) { writerFs.Close(); } } }
感謝: