首页 > 编程开发 > 全文搜索 > lucene

Lucene学习笔记之七:lucene操作索引的几个常用方法

2013-04-08 16:57:20| 发布: 领悟书生| 浏览: 7693

org.apache.lucene.index.IndexWriter

org.apache.lucene.index.IndexReader


通过IndexWriter删除文档

删除的方法如下,可以是一个(一组)Query对象,也可以是一个(一组) Term对象,用deleteAll将删除所有文档

void

deleteAll()

         Delete  all documents in the index.

void

deleteDocuments(Query... queries)

         Deletes  the document(s) matching any of the provided queries.

void

deleteDocuments(Query query)

         Deletes  the document(s) matching the provided query.

void

deleteDocuments(Term... terms)

         Deletes  the document(s) containing any of the terms.

void

deleteDocuments(Term term)

         Deletes  the document(s) containing term.

示例

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

此时删除的文档并不会被完全删除,而是存储在一个回收站中,如果有多个段(Segment),删除后在索引文件中每个段都有一个删除文件(_N_1.del,如_0_1.del,_1_1.del),可以对删除的索引进行恢复


通过IndexReader删除文档

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


查询删除的文档:

System.out.println("deleteDocs:"+reader.numDeletedDocs());

deleteDocs:2


恢复删除文档

使用IndexReader进行恢复,恢复时,必须把IndexReader的只读(readOnly)设置为false(好像3.6及以后的版本不能恢复)

IndexReader reader = IndexReader.open(directory,false);

reader.undeleteAll();


强制合并已删除的文档(清空回收站)

这样就不能恢复了

forceMergeDeletes()
           Forces merging of  all segments that have deleted documents.

forceMergeDeletes(boolean doWait)
           Just like forceMergeDeletes(),  except you can specify whether the call should block until the operation  completes.

示例:

writer.forceMergeDeletes();


合并索引

特别注意:此处Lucene在3.5之后不建议使用,因为会消耗大量的开销,Lucene会根据情况自动处理的

merge(MergePolicy.OneMerge merge)

         Merges  the indicated segments, replacing them in the stack with a single segment.

示例:

writer.forceMerge(2);

会将索引合并为2段,这两段中的被删除的数据会被清空


更新文档

Lucene并没有提供更新,这里的更新操作其实是如下两个操作的合集:先删除之后再添加

Document doc = new Document();

doc.add(new Field("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));

doc.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));

doc.add(new Field("content",contents[0],Field.Store.NO,Field.Index.ANALYZED));

doc.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));

writer.updateDocument(new Term("id","1"), doc);


IndexWriter提交

一般操作后都提交

writer.commit();



本文链接:Lucene学习笔记之七:lucene操作索引的几个常用方法,领悟书生学习笔记,转载请注明出处http://www.656463.com/article/442

如非特别注明,本站内容均为领悟书生原创,转载请务必注明作者和原始出处。
本文地址:http://www.656463.com/article/rqyeim.htm