`
cevin15
  • 浏览: 27817 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

IndexWriter.DeleteDocument与IndexReader.DeleteDocument区别

 
阅读更多
转自http://www.cnblogs.com/zengen/archive/2011/04/18/2019669.html

IndexReader删除
IndexReader.DeleteDocument(int docNum)——根据Document的docId删除单个Document
IndexReader.DeleteDocuments(Term term)——根据Term来删除单个或多个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来进行删除,除非
你必须按照DocId来删除;
删除后搜索要立即看到删除的效果,即删除的数据在搜索的结果中不再出现
你需要知道执行删除操作删除的Document的数量
使用IndexReader进行删除时可能存在以下问题
当有一个IndexWriter打开的时候,IndexReader的删除操作是不能够进行的,否则会报LockObtainFailedException
当IndexReader被多个线程使用的时候,一个线程用其进行删除,会使得另一个线程看到的索引有所改变,使得另一个线程的结果带有不确定性。
对于更新操作,在Lucene中是先删除,再添加的,然而删除的被立刻看到的,而添加却不能够立刻看到,造成了数据的不一致性。
即便以上问题可以通过锁来解决,然而背后的操作影响到了搜索的速度,是我们不想看到的。
使用IndexWriter与IndexReader进行Document删除时唯一的不同是:IndexReader.DeleteDocuments()可以返回被删除的文档数目。
Document一旦被删除,就不会存在于termDocs和termPositions以及任何搜索结果中出现了,当强行载入此文档时会报异常,但是该文档依然会影响docFreq,从而影响搜索评分,这个问题会在包含被删除的Document所在的段(Segment)合并时得到纠正,即当调用IndexWriter.Optimize()时得以纠正。
分享到:
评论

相关推荐

    与lucene3.0兼容的庖丁jar包

    在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z at org.apache.lucene.index....

    Apache Lucene全文检索和IKAnalyzer分词工具类

    indexWriter.updateDocument(term, doc); /**optimize()方法是对索引进行优化 **/ indexWriter.optimize(); indexWriter.close(); } /** * 创建索引(多个) * @param list * @throws Exception ...

    lucene的列子

    你可以通过`IndexWriter`的`addDocument()`方法添加新的文档,或者使用`updateDocument()`方法替换已存在的文档。"删除"操作则可以使用`deleteDocuments()`方法,传入一个`Term`对象来标识要删除的文档。 ```java /...

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    - `IndexReader.deleteDocument(int docID)`:通过文档编号删除文档,立即对当前`IndexReader`生效。 - `IndexReader.deleteDocuments(Term term)`:删除包含特定词的文档,同样立即生效。 - `IndexWriter....

    lucene的curd

    FileUtils.deleteDirectory(directory); ``` 六、整合Hibernate和Struts2 在实际项目中,我们可能需要结合ORM框架(如Hibernate)和MVC框架(如Struts2)来处理数据库数据和Lucene索引的交互。例如,当用户通过...

    Lucene建立索引及查询包含“java”关键字 示例代码

    **Lucene创建索引与搜索"java"关键字的示例代码** Apache Lucene是一个高性能、全功能的文本搜索引擎库,广泛应用于各种系统中用于实现高效、精准的全文检索功能。这个示例代码将向我们展示如何使用Lucene来创建一...

    lucene增删改查小demo

    首先,我们需要定义一个 Document 类型的对象,填充字段(如标题、内容等),然后使用 IndexWriter 将 Document 添加到索引中。以下是一个简单的添加示例: ```java Document doc = new Document(); doc.add(new ...

    lucene 简单例子

    3. **添加文档**:将 Document 对象添加到 IndexWriter 中,完成索引。 4. **关闭 IndexWriter**:确保所有更改都已保存。 以下是一个简单的示例代码: ```java import org.apache.lucene.analysis.standard....

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    directory.Delete(); ``` **Demo项目** 压缩包中的"Demo"文件可能包含了完整的示例代码,包括索引生成、修改、查询和删除的完整流程。通过阅读和运行这些代码,你可以更深入地理解Lucene.NET 2.9.2的工作原理,并...

    基于JAVA的搜索引擎 lucene-2.2.0

    当构造完一个索引器IndexWriter之后,就可以向其中添加Document了。 在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是...

    lucene练习代码

    **安装与配置** 在开始使用Lucene之前,你需要将其导入到你的开发环境中。对于Eclipse或Myeclipse用户,可以通过以下步骤进行配置: 1. 下载最新版本的Lucene库(通常为jar文件)。 2. 将下载的jar文件添加到项目...

    Lucene3.0创建索引

    IndexWriter indexWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); // 获取所有待索引的文件列表 File[] files = new File(dateDir).list...

    lucene for java 简单demo

    2. **添加文档**:创建一个Document对象,为每个字段添加值,然后将其添加到IndexWriter中。 3. **搜索**:使用Analyzer创建一个QueryParser,解析用户的查询字符串;使用Query对象在索引中执行搜索;通过Searcher...

    Lucene 索引、删除、检索 实例

    - **使用IndexWriter删除文档**: 使用`indexWriter.deleteDocuments(term)`删除与该Term匹配的所有文档。 - **关闭IndexWriter和IndexReader**: 记得关闭所有打开的资源。 ### 3. Lucene 检索 检索是Lucene的核心...

    Lucene入门示例

    5. **索引Document**:通过`indexWriter.addDocument(document)`将文档添加到索引中。 6. **关闭IndexWriter**:完成索引后,调用`indexWriter.close()`确保所有变更被写入。 **三、Lucene搜索流程** 1. **创建...

    基于Lucene的全文检索的Java实现.pdf

    indexWriter.deleteAll(); // 访问数据库取得数据 ResultSet rs = wenjian.getWenjians(); while (rs.next()) { Document doc = new Document(); int id = rs.getInt(1); Integer Id = new Integer(id); doc...

    Lucene简单Demo(附带Jar)

    4. **添加Document到索引**: 使用`indexWriter.addDocument(document)`将文档添加到索引。 5. **关闭IndexWriter**: `indexWriter.close()`确保所有更改被写入磁盘。 6. **创建IndexReader和IndexSearcher**: 用于...

    lucene 3.4基本应用

    了解其核心组件如`Analyzer`、`Document`、`Field`、`Query`、`IndexWriter`和`Searcher`的工作原理,并尝试自己实现一个简单的搜索引擎。通过不断的实践和优化,你将能更好地掌握Lucene在实际项目中的应用。 总之...

    lucene示例代码

    实际项目中,Lucene 还可以与其他技术结合,如 Solr 或 Elasticsearch,以实现更复杂、更高效的企业级搜索引擎解决方案。了解和掌握 Lucene 的原理和实践,对于提升 Java 应用程序的搜索性能至关重要。

    第一个lucene程序

    4. **结果获取与展示**:搜索结果通常是一个`ScoreDoc`的集合,每个`ScoreDoc`对应一个文档及其相关的分数。开发者可以根据这些信息获取文档的详细内容并显示给用户。 下面是一个简单的Lucene程序示例,演示如何...

Global site tag (gtag.js) - Google Analytics