Lucene-lucene2.4怎么删除指定的一条索引呢

Lucene-lucene2.4怎么删除指定的一条索引呢

瑾兮 发布于 2017-08-12 字数 109 浏览 1233 回复 3

我现在生成了索引文件,但是我想删除索引文件里某一条索引记录,这个要怎么删除啊,我执行了删除语句没反应啊

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-10-27 3 楼

删除指定的索引:IndexWriter.DeleteDocuments(Term term),比如删除id=1的索引:

writer.deleteDocuments(new Term("id","1"));

要注意在执行了DeleteDocument或者DeleteDocuments方法后,系统会生成一个*.del的文件,该文件中记录了删除的文档,但并未从物理上删除这些文档。所以要用Optimize()来清除掉。比如:

 writer.deleteDocuments(new Term("id","1"));//这里删除id=1的文档,还会留在”回收站“。x.del
writer.Optimize();//清空回收站
writer.close();

瑾兮 2017-10-16 2 楼

就我所知,Lucene中删除索引可以使用IndexReader和IndexWriter来删除索引,具体解释如下:

IndexReader 删除索引

若需要从索引中删除某一个或者某一类文档,IndexReader提供了两种方法:
reader.DeleteDocument(int docNum) — 根据Document的docId删除单个Document
reader.DeleteDocuments(Term term) — 根据Term来删除单个或多个Document

前者是根据文档的编号来删除该文档,docNum是该文档进入索引时Lucene的编号,是按照顺序编的;后者是删除满足某一个条件的多个文档。

在执行了DeleteDocument或者DeleteDocuments方法后,系统会生成一个*.del的文件,该文件中记录了删除的文档,但 并未从物理上删除这些文档。此时,这些文档是受保护的,当使用Document doc = reader.Document(i)来访问这些受保护的文档时,Lucene会报“Attempt to access a deleted document”异常。

使用IndexReader进行Document删除操作时,文档并不会立即被删除,而是把这个删除动作缓存起来,直到调用IndexReader.Close()时,删除操作才会被真正执行。

注:使用IndexReader进行删除时,必须关闭所有已经打开的IndexWriter;当使用当前的IndexReader进行搜索时,即使在不关闭IndexReader的情况下,被删除的Document也不会再出现在搜索结果中。

IndexWriter 删除索引

IndexWriter.DeleteDocuments(Query query)——根据Query条件来删除单个或多个Document
IndexWriter.DeleteDocuments(Query[] queries)——根据Query条件来删除单个或多个Document
IndexWriter.DeleteDocuments(Term term)——根据Term来删除单个或多个Document
IndexWriter.DeleteDocuments(Term[] terms)——根据Term来删除单个或多个Document
IndexWriter.DeleteAll()——删除所有的Document

使用IndexWriter进行Document删除操作时,文档并不会立即被删除,而是把这个删除动作缓存起来,当IndexWriter.Commit()或IndexWriter.Close()时,删除操作才会被真正执行。

使用IndexWriter与IndexReader进行Document删除时的不同是:

IndexReader.DeleteDocuments()可以返回被删除的文档数目。

使用 IndexWriter 删除索引的范例代码:

Term term = new Term(“title”, “update”);
MultiFieldQueryParser parser = new MultiFieldQueryParser(version, new string[] { “title”, “content” }, analyzer);
Query query = parser.Parse(“update”);

IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), false, IndexWriter.MaxFieldLength.LIMITED);

writer.DeleteDocuments(term); // 或者 writer.DeleteDocuments(query);
writer.Commit();

txtMessage.Text += “删除记录: ” + writer.HasDeletions().ToString() + Environment.NewLine;
writer.Close();

您问题中提到的删除语句是什么?可以贴出来看看。

浮生未歇 2017-09-06 1 楼

终于解决了,原因在于生成索引的时候没有分词,Field.Index.TOKENIZED,我原来的是Field.Index.NO,所以找不到指定的索引。
public static void indexFileDel(Photo[] list, IndexWriter diskWriter,String indexDir,String uid) throws CorruptIndexException, IOException {
diskWriter.deleteDocuments(new Term("uid",uid));//这里删除id=uid的文档,还会留在”回收站“。x.del

diskWriter.optimize();//清空回收站

Document doc = new Document();

doc.add(new Field("uid",String.valueOf(list[0].getUid()), Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("name",list[0].getName(),Field.Store.YES,Field.Index.TOKENIZED));
doc.add(new Field("card_id", list[0].getCard_id(), Field.Store.YES,Field.Index.TOKENIZED));
doc.add(new Field("url",list[0].getUrl(),Field.Store.YES,Field.Index.TOKENIZED));

diskWriter.addDocument(doc);
diskWriter.optimize();
diskWriter.close();
}