今天使用Lucene的DeleteDocuments刪除索引代碼執行了,但是卻還能搜索到該索引
這下面的代碼看一點錯誤都沒有,執行了但是卻沒有真正的刪除索引
public static void DelSingleIndex(Analyzer analyzer, bool b, string path) { DirectoryInfo dirInfo = Directory.CreateDirectory(path); LuceneIO.Directory directory = LuceneIO.FSDirectory.Open(dirInfo); IndexWriter writer = new IndexWriter(directory, analyzer, b, IndexWriter.MaxFieldLength.LIMITED); writer.DeleteDocuments(new Term("Id", "-1000")); writer.Optimize(); writer.Close(); }搞了半天才明白刪不掉的原因是我添加的代碼Id這個字段做了分詞處理,代碼如下public static void AddSingleIndex(Analyzer analyzer, bool b, string path) { DirectoryInfo dirInfo = Directory.CreateDirectory(path); LuceneIO.Directory directory = LuceneIO.FSDirectory.Open(dirInfo); IndexWriter writer = new IndexWriter(directory, analyzer, b, IndexWriter.MaxFieldLength.LIMITED); Document doc = new Document(); doc.Add(new Field("Id", "-1000", Field.Store.YES, Field.Index.NOT_ANALYZED));//存儲且索引 doc.Add(new Field("Title", "最新的特朗普測試", Field.Store.YES, Field.Index.ANALYZED));//存儲且索引 doc.Add(new Field("Content", "123456789", Field.Store.YES, Field.Index.ANALYZED));//存儲且索引 doc.Add(new Field("PubDate", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), Field.Store.YES, Field.Index.NO));//存儲且不需要索引 doc.Add(new Field("LinkUrl", "testlink", Field.Store.YES, Field.Index.NO));//存儲且不需要索引 writer.AddDocument(doc); writer.Optimize(); writer.Close(); }這里只要將以下代碼doc.Add(new Field("Id", "-1000", Field.Store.YES, Field.Index.ANALYZED));//存儲且索引改為doc.Add(new Field("Id", "-1000", Field.Store.YES, Field.Index.NOT_ANALYZED));//存儲不分詞且索引就是因為這個參數設置錯誤導致的還有種情況就是下面的代碼設置也會導致刪除不成功,代碼如下
doc.Add(new Field("Id", "-1000", Field.Store.YES, Field.Index.NO));因為Lucene在刪除索引時要求刪除對應的Field不能分詞只能是一個詞,而且這個Filed必須索引過還有個注意點是在刪除時使用Term時的原理是先去搜索滿足條件的記錄然后將所有滿足的記錄刪除,所以官方也建議最好自己定義一個唯一標識來刪除,比如我這邊用的是自己定義的Id,而沒有用Title,還比如新聞編號,產品編號等等
新聞熱點
疑難解答