`
forfuture1978
  • 浏览: 412913 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关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同时持有一个索引文件,这个时候有什么具体的限制么?

相关推荐

    Hbase 二级索引方案

    Lily HBase Indexer 是一款灵活的、可扩展的、高容错的、事务性的,并且近实时的处理 HBase 列索引数据的分布式服务软件。它是 NGDATA 公司开发的 Lily 系统的一部分,已开放 源代码。Lily HBase Indexer 使用 ...

    ES 的使用安装删除、各种操作配置代码

    ES是一个高度可伸缩的开源的全文检索和分析引擎,它允许你以近实时的方式快速存储、搜索、分析大量数据,ES是基于Lucence开发,隐藏其复杂性,提供了简单易用的restful api接口、Java api接口 1)、高度的可伸缩性 ...

    hibernate-search

    Hibernate搜索描述全文搜索Java对象该项目提供了由Hibernate ORM管理的实体与诸如Apache Lucene和Elasticsearch之类的全文索引服务之间的同步。 它将自动将更改应用于索引,这是繁琐且容易出错的编码工作,同时使您...

    java8集合源码-udemy_ElasticSearch:udemy_ElasticSearch

    弹性搜索具有高度可扩展性,并提供近乎实时的性能。 一个叫 Kibana 的工具经常用来可视化数据来添加 BI 我们可以在弹性集群上执行强大的分析查询。 弹性搜索能够查找、检索和分析数据。 Elastic 以针对搜索优化的...

    java开源包6

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    ZendFramework中文文档

    10.1.4. 事务处理 10.1.5. 插入数据行 10.1.6. 更新数据行 10.1.7. 删除数据行 10.1.8. 取回查询结果 10.2. Zend_Db_Statement 10.2.1. Creating a Statement 10.2.2. Executing a Statement 10.2.3. ...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    数据库开发基础、Microsoft SQLServer基础、SQL语言基础、索引、事务、SQL语言高级技术(空值处理、聚合与分组、数据分页、Union、日期函数、类型转换函数、流控函数、表连接、子查询、存储过程、触发器)、数据库...

    java开源包1

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包11

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包2

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包3

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包5

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包10

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包4

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包8

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包7

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

    java开源包9

    该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存...

Global site tag (gtag.js) - Google Analytics