`
caozuiba
  • 浏览: 903226 次
文章分类
社区版块
存档分类
最新评论

Lucene.net 系列四 --- index 下

 
阅读更多
<iframe marginwidth="0" marginheight="0" src="http://218.16.120.35:65001/PC/Global/images/b.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

本文将介绍有关索引并发控制的问题,以结束对Lucene.net建立索引问题的讨论.

1. 允许任意多的读操作并发.即可以有任意多的用户在同一时间对同一份索引做查询工作.

2.允许任意多的读操作在索引被正在被修改的时候进行.即哪怕索引正在被优化,添加删除文档,这时也是允许用户对索引进行查询工作. (it’s so cool.)

3.同一时间只允许一个对索引修改的操作.即同一时间只允许IndexWriter或IndexReader打开同一份索引.不能允许两个同时打开一份索引.

Lucene提供了几种对索引进行读写的操作.添加文档到索引,从索引中删除文档,优化索引,合并Segments.这些都是对索引进行写操作的方法. 查询的时候就会读取索引的内容.

有关索引并发的问题是一个比较重要的问题,而且是Lucene的初学者容易忽略的问题,当索引被破坏,或者程序突然出现异常的时候初学者往往不知道是自己的误操作造成的.

下面让我们看看Lucene是如何处理索引文件的并发控制的.

首先记住一下三点准则:

1. 允许任意多的读操作并发.即可以有任意多的用户在同一时间对同一份索引做查询工作.

2.允许任意多的读操作在索引被正在被修改的时候进行.即哪怕索引正在被优化,添加删除文档,这时也是允许用户对索引进行查询工作. (it’s so cool.)

3.同一时间只允许一个对索引修改的操作.即同一时间只允许IndexWriter或IndexReader打开同一份索引.不能允许两个同时打开一份索引.

第一个准则很容易理解,第二个准则说明Lucene对并发的操作支持还是不错的.第三个准则也很正常,不过需要注意的是第三个准则只是表明IndexWriter和IndexReader不能并存,而没有反对在多线程中利用同一个IndexWriter对索引进行修改.这个功能可是经常用到的,所以不要以为它是不允许的.不过这个时候的并发就需要你自己加以控制,以免出现冲突.

(注: 在前面的系列中已说过IndexReader不是对Index进行读操作,而是从索引中删除docuemnt时使用的对象)

有关这三个原则在实际使用Lucene API时候的体现,让我们先看看下面这张表:


表中列出了有关索引的主要读写操作.其中空白处表示X轴的操作和Y轴的操作允许并发.

而X处表明X轴的操作和Y轴的操作不允许同时进行.

比如Add document到索引的时候不允许同时从索引中删除document.

其实以上这张表就是前面三个准则的体现.Add Optimize Merge操作都是由IndexWriter来做的.而Delete则是通过IndexReader完成.所以表中空白处正是第一条和第二条准则的体现,而X(冲突)处正是第三个原则的具体表现.

为了在不了解并发控制的情况下对Lucene API的乱用. Lucene提供了基于文件的锁机制以确保索引文件不会被破坏.

当你对index 进行修改的时候, 比如添加删除文档的时候就会产生 ***write.lock文件,而当你从segment进行读取信息或者合并segments的时候就会产生***commit.lock文件.在默认情况下,这些文件是放在系统临时文件夹下的. 简而言之, write.lock文件存在的时间比较长,也就是对index进行修改的锁时间比较长,而commit.lock存在的时间往往很短.具体情况见下表.

如果索引存在于server, 很多clients想访问的时候,自然希望能看到其他用户的锁文件,这时把锁文件放到系统临时文件夹就不好了.此时可以通过配置文件来改变锁文件存放的位置.

比如在一个asp.net的应用下,你就可以象下面这样利用web.config文件来实现你的目的.

<configuration>
<appSettings>
<add key="Lucene.Net.lockdir" value="c:yourdir" />
</appSettings>
</configuration>

不仅如此,在某些情况下比如你的索引文件存放在一个CD-ROM中,这时根本就无法对索引进行修改,也就不存在所谓的并发冲突,这种情况下你甚至可以讲锁文件的机制取消掉.同样通过配置文件.

<configuration>
<appSettings>
<add key="disableLuceneLocks" value="true" />
</appSettings>
</configuration>

不过请注意不要乱用此功能,不然你的索引文件将不再受到安全的保护.

下面用一个例子说明锁机制的体现.

using System;
using System.IO;
using Lucene.Net.Analysis;
using Lucene.Net.Index;
using Lucene.Net.Store;
using NUnit.Framework;
using Directory = Lucene.Net.Store.Directory;


[TestFixture]
public class LockTest
{
private Directory dir;

[SetUp]
public void Init()
{
String indexDir = "index";
dir = FSDirectory.GetDirectory(indexDir, true);
}

[Test]
[ExpectedException(typeof(IOException))]
public void WriteLock()
{
IndexWriter writer1 = null;
IndexWriter writer2 = null;
try
{
writer1 = new IndexWriter(dir, new SimpleAnalyzer(), true);
writer2 = new IndexWriter(dir, new SimpleAnalyzer(), true);

}
catch (IOException e)
{
Console.Out.WriteLine(e.StackTrace);
}
finally
{
writer1.Close();
Assert.IsNull(writer2);
}
}

[Test]
public void CommitLock()
{
IndexReader reader1 = null;
IndexReader reader2 = null;
try
{
IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(),
true);
writer.Close();
reader1 = IndexReader.Open(dir);
reader2 = IndexReader.Open(dir);
}
finally
{
reader1.Close();
reader2.Close();
}
}
}

不过很令人失望的是在Lucene(Java)中应该收到的异常在dotLucene(1.4.3)我却没有捕获到.随后我在dotLucene的论坛上问了一下,至今尚未有解答.这也是开源项目的无奈了吧.

分享到:
评论

相关推荐

    lucene.net-1.9 source code

    Apache Lucene是一个基于Java全文搜索引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析...

    基于Lucene.Net 的桌面搜索源代码

    Lucene.Net 源搜索引擎源代码 使用说明: 一、在IIS上建立虚拟目录,指向web 二、Web\Data\Config.xml 配置索引目录 三、运行Web\Data\IndexFiles.exe 建立文件索引(自己也可以写一个批处理,定时更新索引) 四、...

    DotLucene演示源码.rar

    DotLucene实际是Lucene的Asp.net版本,也称为lucene.net 该项目的原型为DotLuceneAPISearchDemo-1.1,后经51aspx升级为Asp.net2.0版本并改为WebApplication类型 该demo演示了Lucene的常用功能(智能分词、关键字...

    lucenenet:Apache Lucene.NET

    Apache Lucene.NET网站位于: : 支持的框架Lucene.NET 3.0.3 .NET Framework 4.0 .NET Framework 3.5Lucene.NET 4.8.0 .NET Framework 4.5地位最新稳定版本:Lucene.NET 3.0.3 致力于Lucene.NET 4.8.0(当前在BETA...

    BoboBrowse.Net:BoboBrowse.Net是在Lucene.Net顶部实现的多面浏览引擎。 最初从John Wang(http

    面向Lucene.Net的多面搜索 Bobo-Browse是建立在Lucene.Net之上的功能强大且可扩展的多面搜索引擎库。 它是John Wang用Java编写的的C#端口。 该项目基于和早期工作,但两个版本均基于Bobo-Browse.Net2.x。 这是的...

    CodeIndex:基于Lucene.Net的代码搜索工具

    基于Lucene.Net的快速全文本搜索工具 特征 支持多个索引 自动监视索引文件的更改 支持对文件内容,名称,位置,扩展名的各种搜索(例如:模糊,通配符,区分大小写) 支持Docker 支持Visual Studio 展示现场 指导 ...

    lucene2.9.1所有最新开发包及源码及文档

    开源全文搜索工具包Lucene2.9.1的使用。 1. 搭建Lucene的开发环境:在classpath中添加lucene-core-2.9.1.jar包 2. 全文搜索的两个工作: 建立索引文件,搜索索引. 3. Lucene的索引文件逻辑结构 1) 索引(Index)由...

    检查:由Lucene.Net支持的.NET索引和搜索引擎

    通过Examine,您可以轻松地对数据进行索引和搜索,并包装Lucene.Net索引/搜索引擎。 Lucene超级快,即使在非常大量的数据上也允许非常快速的搜索。 检查是非常可扩展的,它允许您配置任意数量的索引,并且每个索引...

    Lucene desktop index-开源

    一个基于c#和.net 2.0编写的Lucene索引的桌面搜索应用程序。 索引常见的文件类型,网络驱动器,Outlook电子邮件,SQL Server表,当然还有搜索

    ik对应的7.x分词器

    1、复制lucene-analyzers-smartcn-7.2.0.jar(在contrib/analysis-extras/lucene-libs目录下)到server/solr-webapp/webapp/WEB-INF/lib目录下 2、在managed-schema(在server/solr/stu/conf目录下,这里选的自定义...

    Baioogle-SearchEngine(百歌搜索引擎)

    WebRoot\WEB-INF\index WebRoot\WEB-INF\*.* WebRoot\cache\wget.exe WebRoot\cache\make-cache.bat 6.本系统最终运行组件包(发行包)仅包括WebRoot内的文件。src内的文件为本系统的源代码,但src中的内容要...

    lucene分组查询优化facet

    我的博客专栏http://blog.csdn.net/wuyinggui10000/article/category/3173543,希望大家关注

    FluentLucene:流利地实现Lucene

    Lucene.Net的流畅包装器,可抽象文档的创建。 灵感来自流利的NHibernate。 创建带有覆盖的Lucene文档 public class ComplexObjectOverride : ILuceneMappingOverride { public void Override(LuceneMapping...

    单点登录源码

    文件存储系统,提供四种方案: - **阿里云** OSS - **腾讯云** COS - **七牛云** - 本地分布式存储 ![阿里云OSS](project-bootstrap/aliyun-oss-post-callback.png) &gt; zheng-api 服务网关,对外暴露统一规范的...

    UindexWeb 开源蜘蛛程序(含全部控件+源代码)

    UindexWeb简介 一个一直在改进的,努力成为简洁,最...一个综合ICS,JCL,Lucene.Net,C#优势的展示应用; 一个努力体现Delphi开发原生代码魅力的程序。 UindexWeb 开源蜘蛛程序(含全部控件+源代码)附详细的安装方法。

    XML,XSLT,AJAX三大技术打造开源多用户博客X3BLOG

    自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lucene的.net版本,实现了功能强大执行快速的全文检索引擎。...

    X3BLOG v0.7.5.0

    &lt;br&gt; 自主研发的中文分词技术,速度超过3MB/s,准确率达到90%以上,大大超过网上各种开源中文分词技术,几乎可以和中科院的ICTCLAS相媲美,结合当前最成熟的Lucene的.net &lt;br&gt;版本,实现了功能强大执行快速的...

    搜索引擎 CLucene 源代码

    CLucene 是C++版本的Lucene, .CLucene API文档地址:http://clucene.sourceforge.net/doc/html/index.html

    jsp探针 ver0.1

    Class.forName("org.apache.lucene.index.IndexWriter"); supportLucene = true; } catch (ClassNotFoundException ex) { } try { Class.forName("org.dom4j.Document"); supportDom4j = true; } catch ...

Global site tag (gtag.js) - Google Analytics