`

有关Lucene的问题(6):Lucene的事务性

阅读更多

所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。

  • 当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此后的任何修改都不会被看到。
  • 仅当IndexReader.open打开一个索引后,才有可能看到从上次打开后对索引的修改。
  • 当IndexWriter没有调用Commit的时候,其修改的内容是不能够被看到的,哪怕IndexReader被重新打开。
  • 欲使最新的修改被看到,一方面IndexWriter需要commit,一方面IndexReader重新打开。

下面我们举几个例子来说明上述隔离性:

 

(1) 首先做准备,索引十篇文档

File indexDir = new File("TestIsolation/index");

IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir), new StandardAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);

for(int i =0; i < 10; i++){

  indexDocs(writer);

}

writer.close();

(2) 然后再索引十篇文档,并不commit

writer = new IndexWriter(FSDirectory.open(indexDir), new StandardAnalyzer(Version.LUCENE_CURRENT), IndexWriter.MaxFieldLength.LIMITED);

for(int i =0; i < 10; i++){

  indexDocs(writer);

}

(3) 打开一个IndexReader,但是由于IndexWriter没有commit,所以仍然仅看到十篇文档。

IndexReader reader = IndexReader.open(FSDirectory.open(indexDir));

IndexSearcher searcher = new IndexSearcher(reader);

TopDocs docs = searcher.search(new TermQuery(new Term("contents","hello")), 50);

System.out.println(docs.totalHits);

(4) IndexWriter进行提交commit

writer.commit();

(5) 不重新打开IndexReader,进行搜索,仍然仅看到十篇文档。

docs = searcher.search(new TermQuery(new Term("contents","hello")), 50);

System.out.println(docs.totalHits);

(6) IndexReader重新打开,则可以看到二十篇文档。

reader = IndexReader.open(FSDirectory.open(indexDir));

searcher = new IndexSearcher(reader);

docs = searcher.search(new TermQuery(new Term("contents","hello")), 50);

System.out.println(docs.totalHits);

分享到:
评论
3 楼 wwty 2010-07-02  
SeanHe 写道
wwty 写道
forfuture兄:不知道你研究过lucene的锁机制么?
比如在很多情况下indexreader和indexwriter同时持有一个索引文件,这个时候有什么具体的限制么?

我的印象中对于同一个索引文件同时只能用一个写的线程对文件进行修改,但是对于读线程是没有限制的,也就是说多线程读一个索引文件或者边读边写(只有一个线程在写)都是可以的。
ps:我已经3、4年没搞lucene了不知道现在新版本有哪些改变。

嗯,是的,老版本的原理确实是这样,我也是对3版本的锁机制不是很了解,呵呵,看来还是得自己抽时间查查代码了
2 楼 SeanHe 2010-07-01  
wwty 写道
forfuture兄:不知道你研究过lucene的锁机制么?
比如在很多情况下indexreader和indexwriter同时持有一个索引文件,这个时候有什么具体的限制么?

我的印象中对于同一个索引文件同时只能用一个写的线程对文件进行修改,但是对于读线程是没有限制的,也就是说多线程读一个索引文件或者边读边写(只有一个线程在写)都是可以的。
ps:我已经3、4年没搞lucene了不知道现在新版本有哪些改变。
1 楼 wwty 2010-06-30  
forfuture兄:不知道你研究过lucene的锁机制么?
比如在很多情况下indexreader和indexwriter同时持有一个索引文件,这个时候有什么具体的限制么?

相关推荐

    lucene-jdbcdirectory:Lucene 5.x JdbcDirectory实现

    总结,Lucene 5.x的JdbcDirectory是将索引存储在数据库中的高级特性,它带来了分布式存储和数据一致性的优势,但也带来了一些挑战,如性能和成本问题。开发者需要根据具体的应用需求权衡选择,合理利用这一功能,...

    Lucene与SQL对比学习

    在选择使用哪种技术时,应根据实际需求来决定,如数据类型、查询复杂性、性能要求以及是否需要事务支持等因素。了解它们之间的差异,有助于我们更有效地解决实际问题,提高系统的性能和用户体验。

    lucene-jdbc:这是 Compass 项目采用旧的 JdbcDirectory 实现到 Lucene 5.x

    总之,Lucene-JDBC是一个历史性的项目,它展示了如何利用Java JDBC接口将Lucene索引与数据库结合,这对于了解搜索引擎与数据库的集成,以及学习如何扩展Lucene存储机制有着重要的参考价值。尽管当前可能有更先进的...

    Lucene与关系型数据库对比

    相比之下,关系型数据库在过去的二十余年里,因其操作便捷、易于维护、便于访问和安全性强的特点,在事务处理领域占据了主导地位。它们最初是为了满足诸如库存控制、工资计算、账目处理等传统应用场景而设计的。然而...

    lucene-databasedirectory:Lucene 5.x数据库目录实现

    6. **事务处理**:由于数据库支持事务,可以确保索引更新的一致性和完整性。 7. **并发控制**:数据库提供行级锁定,可帮助处理多线程环境下的并发问题。 8. **备份和恢复**:数据库自身的备份功能使得恢复索引变...

    基于Lucene的全文检索引擎研究与应用

    - **高效性**:Lucene能够快速地构建和访问索引,从而实现高效的文档检索。 - **跨平台**:由于基于Java语言开发,因此Lucene能够在不同的操作系统平台上运行,提高了其适用范围。 - **灵活性**:Lucene允许用户...

    Lucene+3.0+原理与代码分析完整版

    6. **Lucene 的事务性**:Lucene 不直接支持事务,但在设计上支持高并发环境下的安全操作,可以通过外部机制实现事务性的需求。 7. **构建实时索引**:Lucene 支持实时更新索引,允许在不重启服务的情况下增加、...

    conquiris-lucene-3.5.0.zip

    标题 "conquiris-lucene-3.5.0.zip" 提供了我们即将探讨的知识点:Lucene,一个开源的全文搜索引擎库。Lucene是由Apache软件基金会开发的Java库,它提供了高级文本分析和索引功能,使得开发者可以轻松地在应用程序中...

    Lucene与SSH2搜索功能

    **正文** 在IT行业中,搜索功能是任何复杂应用不可或缺的一部分,它使得用户能够高效地查找所需信息。...在实际开发中,还需要考虑并发控制、索引更新策略以及性能优化等问题,以确保系统的稳定性和效率。

    lucene原理与代码分析完整版

    #### 九、Lucene的事务性和实时索引构建 Lucene虽然主要用于离线索引构建,但也支持一定程度上的事务性操作和实时索引更新。这对于需要频繁更新索引的应用场景非常重要。 #### 十、其他相关问题 除了以上核心知识...

    SQLServer+Lucene.Net例子

    它支持事务处理、数据仓库、数据分析等多种业务场景,提供强大的性能和稳定性。然而,SQL Server在全文搜索方面虽然内置了一些功能,但在复杂查询和高效率的全文检索方面,可能无法满足所有需求。 这就是Lucene.NET...

    springmvc+mybatis+lucene4文档搜索系统(支持分页)

    在处理大规模数据时,分页是一种有效的展示策略,可以避免一次性加载过多数据导致的性能问题。在本系统中,我们利用SpringMVC的模型绑定功能,结合Lucene和MyBatis的查询能力,实现了基于关键词的文档搜索结果的分页...

    全文检索Lucene 全文检索Lucene

    - **Compass**:基于Lucene的高级搜索框架,提供了一种更简便的方式来集成Lucene到应用程序中,支持事务、缓存和实时检索等功能。 - **GazelleQuery**:Compass扩展了Lucene的查询机制,提供了更丰富的查询语法和...

    Lucene+compass学习资料

    然后通过Ajax实现前端与后端的无刷新通信,当用户在搜索框中输入关键词时,立即向服务器发送请求,服务器利用Lucene进行查询,并用Ajax返回结果,这样就能在用户输入的同时展示相关的搜索结果,极大地提升了搜索效率...

    lucene3_ssh.rar_lucene

    1. **环境准备**:确保项目中已经引入了Lucene的相关库,包括core、queryparser和analyzers-common等模块。同时,SSH框架也需配置正确,以便后续操作。 2. **索引创建**:在Struts Action或Spring Service层,定义...

    SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN)

    在积分系统中,Spring可以用来管理数据库连接池、事务控制、服务层对象等,确保系统的稳定性和可维护性。 2. **SpringMVC**:这是Spring框架的一个模块,用于处理Web请求。它采用模型-视图-控制器(MVC)架构模式,...

    精品资料(2021-2022收藏)Lucene:基于Java的全文检索引擎简介.docx

    Cutting创建Lucene的目的是为了简化在各种规模的应用程序中实现全文检索的复杂性。自2001年起,Lucene成为了Apache基金会的一部分,并且随着时间的推移,许多知名的Java项目如Jive、Cocoon和Eclipse都采用了Lucene...

    ssh集成Lucene4.7demo

    Spring框架则是一个全面的企业级应用开发框架,它包括了依赖注入、面向切面编程、事务管理等功能,可以有效简化应用的复杂性。Hibernate则是一个持久层框架,负责对象关系映射(ORM),使得开发者可以使用Java对象来...

    struts2+ibitas+spring+lucene 整合

    iBatis与Spring结合,可以实现事务管理和DAO(Data Access Object)的管理,提高了代码的可维护性和可测试性。 Spring 框架是Java企业级应用的核心框架,它提供了一个全面的基础设施,支持创建和管理Bean、AOP...

    一种基于Lucene检索引擎的全文数据库的研究与实现

    本文探讨了一种基于Lucene检索引擎的全文数据库的实现方案,通过将全文检索技术与文件系统相结合,有效地解决了非结构化文本数据的管理和检索问题。这种方法不仅提高了检索效率,还降低了系统的复杂度,对于需要处理...

Global site tag (gtag.js) - Google Analytics