索引的删除,纠结了很久,看到一篇总结不错的文章,转载过来好好学习
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()时得以纠正。
转自:http://www.cnblogs.com/zengen/archive/2011/04/18/2019669.html
另外还有一篇参考:http://www.blogjava.net/huangfox/articles/332845.html
分享到:
相关推荐
Lucene.NET为C#开发者提供了丰富的类库,如Directory、IndexWriter、IndexReader、Searcher等,方便集成到.NET应用中。通过这些接口,开发者可以轻松实现索引构建、查询执行、结果处理等功能。 五、高级特性 1. 多...
Lucene.Net 2.0 版本提供了强大的搜索功能,使得开发者能够轻松地在大量数据中进行高效的文本检索。这个类MSDN操作文档包含了对 Lucene.Net 2.0 的详细说明,帮助开发者理解和使用其丰富的特性和功能。 ### Lucene...
Lucene最初由Doug Cutting创建,是Java社区中的一个标志性项目,而Lucene.Net则使得.NET开发者也能享受到Lucene的强大功能。 全文搜索引擎是一种能够理解并处理自然语言的系统,它能在大量的文档中查找包含特定查询...
**Lucene.Net 2.9.2 源码包详解** Lucene.Net 是一个开源全文搜索引擎库,它是 Apache Lucene 的 .NET 版本,为 .NET 开发人员提供了强大的搜索功能。Lucene.Net 2.9.2 版本是这个项目的其中一个稳定版本,提供了对...
本文将深入探讨如何使用C#语言结合Lucene.NET库来实现高效的文本搜索,同时也会展示如何在控制台环境中实现用户交互式搜索。 Lucene.NET是Apache Lucene项目的一个.NET版本,它是一个全文搜索引擎库,提供了强大的...
**Lucene.Net** 是一个基于 .NET Framework 的全文搜索引擎库,它是 Apache Lucene 项目的 .NET 实现。这个开源项目提供了高效、可扩展的搜索功能,使得开发者能够在其应用程序中轻松地实现高级的文本检索功能。 **...
《深入理解Lucene.Net 4.8:源码解析与实战指南》 Lucene.Net,作为.NET平台下的全文搜索引擎库,是开发高效、可扩展的搜索功能的强大工具。4.8.0版本作为其重要的更新迭代,引入了诸多新特性与优化,为开发者提供...
在.NET环境中,Lucene.Net提供了一套高效、灵活的API,用于索引和搜索大量文本数据。本文将深入探讨如何利用Lucene.Net结合eaglet的盘古分词进行中文分词和搜索的实例。 首先,我们需要了解盘古分词。盘古分词是...
《深入剖析Lucene.Net 2.9.2:C#版源码解析与应用实践》 Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目在.NET平台上的实现,适用于C#开发者。版本2.9.2是该库的一个稳定版本,提供了强大的文本搜索功能...
- **稳定性与兼容性**:此版本增强了稳定性和与其他.NET库的兼容性,使得开发者可以更安心地将其集成到项目中。 **3. Lucene.Net工作流程** - **索引创建**:首先,开发者需要创建一个`IndexWriter`实例,然后添加...
- **评分与排序**:Lucene.Net会根据词项在文档中的频率、位置等因素计算相关性分数,用于决定搜索结果的排序。 3. **Lucene.Net关键类** - **Analyzer**:负责文本分析,包括分词和标准化。 - **IndexWriter**...
Lucene.NET 是一个基于 Apache Lucene 的全文检索库,它为 .NET Framework 提供了强大的文本搜索功能。这个示例代码展示了如何在 .NET 环境下使用 Lucene.NET 进行基本的索引创建和查询操作。 1. **索引创建**: -...
为了在C#中使用Lucene,我们需要借助.NET上的Lucene.NET,这是一个与Java Lucene兼容的.NET框架版本。 接下来,我们探讨C#调用Lucene的步骤: 1. **引入Lucene库**:在C#项目中,首先需要添加对Lucene.NET的引用。...
1. **Analyzer**: 分析器是Lucene.net中的关键组件,负责将用户输入的文本转化为可被索引的单元——术语(Term)。Analyzer通常包括Tokenization(分词)、Stemming(词干提取)和Stopword Removal(停用词移除)等...
Lucene.NET的核心组件包括Analyzer(分析器)、Document(文档)、Field(字段)、IndexWriter(索引写入器)和Searcher(搜索器)等。 在创建索引的过程中,Analyzer的作用至关重要。Analyzer负责将输入的文本分词...
《深入剖析Lucene.NET 2.3.2:.NET平台下的开源全文搜索引擎》 Lucene.NET是一款在.NET平台上实现的开源全文搜索引擎库,它基于Java版本的Lucene,为.NET开发者提供了强大的文本搜索功能。Lucene.NET 2.3.2版本是其...
在“Lucene.net与Sql索引源码”这个主题中,我们将探讨如何将Lucene.NET与SQL数据库集成,构建一个强大的混合搜索解决方案。 首先,让我们理解Lucene.NET的工作原理。Lucene.NET是基于倒排索引(Inverted Index)的...
Lucene 提供了强大的文本搜索功能,而 Lucene.Net 则将其适应于 .NET 平台,使其能无缝地融入 C#、VB.NET 或其他 .NET 语言的项目中。这个库的版本 2.31 提供了稳定性和性能的改进,为开发者提供了一套完整的文本...