關於Lucene.net 2.9.2.2 中刪除索引的若干問題

最近項目中用到了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();
        }
    }
}
複製代碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章