今天在测试lucene的删除索引中遇到一个问题
测试代码如下:
。。。。。。。
protectedvoidsetUp()throwsException...{
super.setUp();
deleteIndexBuilder=(DeleteIndexBuilder)CTX
.getBean("deleteIndexBuilder");
addIndexBuilder=(AddIndexBuilder)CTX.getBean("addIndexBuilder");
addIndexBuilder.getConstant().setCreateAble(true);
addIndexBuilder.buildIndex();
}
。。。。。。。
publicvoidtestDeleteIndex()throwsException...{
//代码段1
IndexReaderreader2=IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());
assertEquals(23,reader2.numDocs());
reader2.close();
//代码段2
deleteIndexBuilder.buildIndex();
//代码段3
IndexReaderreader3=IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());
assertEquals(13,reader3.numDocs());
reader3.close();
}
在测试中,首先重建索引(见setup方法),在测试方法中可以看出
1) 删除前有23个doc(见代码段1)
2) 删除索引(共10个doc,见代码段2)
3) 删除后有13个doc(见代码段3)
第一次执行,没问题,第二次执行就发现代码段1处出现断言错误,说该处此刻只有13个doc
后来发现原来使用IndexReader.deleteDocuments 方法就算调用了IndexReader.close也并不删除doc,这与lucene in action(page 33)中的说法有些出入
Documentdeletionisdoneusingaclassthatissomewhatinappropriately
calledIndexReader.Thisclassdoesn’tdeleteDocumentsfromtheindeximmediately.
Instead,itmarksthemasdeleted,waitingfortheactualDocumentdeletion
untilIndexReader’sclose()methodiscalled.
我想也许是lucene版本不一样的原因.
其实使用lucene删除,lucene会做好删除标记直到你调用IndexWriter.optimize()才真正从库中删除.
出现上面测试所遇到的问题正是因为在重建索引时才真正删除doc,这样的话就与断言的23不符合,测试失败
lucene的这种删除方式似乎也不大会影响你的应用,就算没有从库中删除,你也搜索不到这个
doc了,至于是不是要在删除索引的时候添上IndexWriter.optimize()以及IndexWriter.close()这样的代码视情况而定.
分享到:
相关推荐
在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...
Lucene 删除 合并索引,可以指定几个索引文件合并成一个索引文件。自己写的,有很多不足之处请多指教
如果需要完全删除索引,可以使用以下代码: ```csharp directory.Delete(); ``` **Demo项目** 压缩包中的"Demo"文件可能包含了完整的示例代码,包括索引生成、修改、查询和删除的完整流程。通过阅读和运行这些...
- **处理删除数据**:删除操作需要在索引中标记文档为删除,而不是物理删除。在Lucene中,我们可以使用`IndexWriter.deleteDocuments(Term)`方法来标记特定的文档为删除状态。 - **提交与刷新**:在处理完所有变更...
- **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段(Field)。 - **字段(Field)**:字段是文档的组成部分,每个字段都有特定的类型(如文本、日期等),并可以被索引或...
本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...
- 使用`addDocument`方法:通过`IndexWriter`将文档添加到索引中。 **4. 更新和删除文档** - 更新文档:Lucene不支持直接更新已存在的文档,而是通过删除旧文档并重新添加新文档的方式来实现。 - 删除文档:调用`...
用户输入查询后,系统会解析查询语句,与索引中的条目进行匹配,然后返回最相关的文档。Lucene.NET提供了丰富的查询语法,包括布尔查询、短语查询、模糊查询等,可以满足各种复杂的搜索需求。 该项目可能还涉及到...
2. **.del文件**:记录了被删除的文档ID,当文档被删除时,并不立即从索引中移除,而是标记为删除,以便在后续合并段时处理。 3. **.tii和.tis文件**:存储了Term信息的索引,用于快速找到对应Term的postings列表。...
在Lucene中,索引是由一系列文档(document)组成的,每个文档包含多个域(field),每个域又由多个项(term)构成。项是基本的搜索单元,通常是一个字符串。例如,一篇文章的标题、内容、作者等都可以被视为不同的...
- 更新和删除:如果数据发生改变,Lucene提供机制更新索引或删除文档。 - 多线程支持:在大型应用中,可能需要并发创建和查询索引,Lucene支持多线程操作。 - 性能优化:如使用内存映射文件(MMapDirectory)、优化...
在Document中添加Field后,调用IndexWriter的addDocument方法将其添加到索引中。记得在完成所有添加后,调用commit方法保存索引,确保数据持久化。 在实际应用中,可能还需要考虑一些高级特性,如更新已有索引、...
Lucene索引存储在文件系统中,因此需要创建一个目录来保存索引。可以使用`FSDirectory`类来实现: ```java File indexLocation = new File("index"); Directory directory = FSDirectory.open(indexLocation.toPath...
要删除索引中的文档,首先需要找到对应的Document的唯一标识,通常通过Document中的唯一ID字段。然后,可以使用以下步骤: - **打开IndexReader**: 首先,需要打开一个IndexReader,这允许读取索引而不修改它。例如...
Lucene 提供了强大的文本分析、索引创建、文档检索以及搜索结果排序等功能。在 .NET 平台上,Lucene.net 提供了与原生 Lucene 相同的强大功能,并且完全兼容 .NET Framework 和 .NET Core。 1. **文本分析(Text ...
Lucene 是一个强大的全文搜索引擎库,通过创建、增加、更新和删除索引来管理文本数据的检索。理解并熟练运用这些操作是构建高效搜索应用的关键。通过 `LuceneTest` 示例代码,开发者可以深入理解这些概念并应用于...
**Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...
**删除索引**操作可以通过以下方式完成: 1. 获取要删除文档的唯一标识符,通常是`Document`中的`ID`字段。 2. 创建一个`Term`对象,指定字段名和对应的值。 3. 调用`IndexWriter`的`deleteDocuments(Term)`方法执行...
在本主题中,我们将深入探讨如何使用Lucene进行创建、删除、修改和组合条件查询,以及如何实现类似MySQL中的LIKE、IN、OR和时间范围条件查询。 首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源...
在给定的`MailDAO.java`文件中,可能包含了一个用于操作邮件数据的DAO(Data Access Object)类,通过这个类,我们可以将邮件内容存储到Lucene索引中,或者从索引中检索相关的邮件信息。使用DAO模式,有助于保持业务...