最近项目需要全文检索,所以找了几个开源的.NET检索项目,如:Lucene.net,Sphinx,Hubble.net。最后选择使用Lucene.ne来实现全文检索。至于原因嘛,可以参考下面几点:

1)     Sphinx性能非常好,而且和Mysql结合的也非常好,但是,我们目前使用的是SqlServer,这个优势我们也就用不着了,关键问题在于,Sphinx需要把整个索引吃到内存中,当索引比较大时,内存会不够,关键是这个问题没有找到合适的解决方案,最后只能舍弃。

2)     Hubble.net的性能也很好,而且和SqlServer结合的非常好,所以,打算使用Hubble.net,使用时发现,Hubble.net只有在查全文时,才会使用Hubble.net自身检索引擎。如果要查一些整形或时间或关键词精确匹配时,就必须通过SqlServer的检索来实现。听说作者已经有意要把整形或时间等其它类型数据放入Hubble.net来进行检索。目前只能期待。。。。

3)     Lucene.net,这是目前使用的检索项目。Lucene.net在性能方面可能不如上面两种,但是性能至少能满足我们目前的需求,而且有灵活的检索方式,强大的社区支持,丰富的资料说明,这是我决定使用Lucene.net项目的原因。

如果我介绍的Sphinx和Hubble.net项目的缺陷已经解决或有解决方式,请高手们不吝赐教,谢谢。

测试服务器为HP服务器,Windows08系统,12核CPU,16G内存。

软件架构使用.Net4.0+Sqlserver08+Lucene.net3.0+盘古分词。

数据量约2300万,索引30G。

测试方式:单个索引(30G)性能测试、多个索引(每个索引10G,共3个索引)性能测试、多个索引(每个索引10G,共3个索引)并行检索性能测试。

备注:单个索引通过类IndexSearcher实现。

多索引检索通过类MultiSearcher实现。

多索引并行检索通过ParallelMultiSearcher实现。

测试结果:

单个线程下,连续检索25次,取平均值。(不同的关键词,避免Lucene.net的缓存)。

单索引

多索引

多索引并行

408毫秒

420毫秒

230毫秒

多个线程(15个),连续检索25次,取平均值。(不同的关键词,避免Lucene.net的缓存)。

单索引

多索引

多索引并行

1.15秒

1秒

900毫秒

如果线程再多,CPU就会超100%,所以,检索对CPU要求很高,要适应并发,就一定要用缓存。结果显示,多索引并行的效率是最高的,也是最耗CPU的。

下面是我用Lucene.net做个一个例子。如何做索引以及检索的实现,都在源代码中。有兴趣的朋友可以一起看看,如果有好的想法,可以一直讨论商量。下面是检索截图,本人不擅长做前台,页面比较丑,见谅。

总结:

使用Lucene.Net时,在功能与性能方面,谈一下个人体会,仅是个人的体会 。

1)    Lucene.net在检索时,是很耗CPU的,但是,吃内存很少(当然不使用内存模式)。

2)    Lucene.net在多索引并行检索时,效果比单索引更好,建议使用。

3)    IndexSearcher对象打开一次就行,不要频繁打开,很耗时间。

4)    如果要实时索引,建议直接追加索引,不要合并(很耗时),等有空闲的时间,再进行合并,追加后的记录是检索不到的,需要重新打开IndexSearcher。重新打开IndexSearcher很耗时间,所以根据需要去决定何时去重新打开IndexSearcher。

5)    Lucene.net在检索关键词时,如果关键词太长,速度是非常慢的,因为分词后,要检索的词太多,建议分词后,把无用的单个字过滤掉,因为单个字的检索意义不大,而且,很耗时间。如:我们在希望的田野上。分词后为:我们/在/希望/的/田野/上。其中,“在/的”的意义并不大,建议过滤掉,可提高性能。

6)    听说使用固态硬盘可直接提高检索速度,由于本人没有固态硬盘,所以,这里无法给出测试结果,有测试过的朋友,可以讲讲。

7)    如果单台服务器无法满足检索需求时,就必须要分布式了,可采用Lucene.net+Wcp+缓存服务器来解决。WCP来做通信,Lucene做检索,中央服务器向各检索服务器发送请求,然后实现各个检索服务器结果集的合并,缓存服务器来解决大并发的问题。这个方案我目前还没有测试过,只是一个想法。等日后验证完,再与各位朋友交流。

感谢盘古作者eaglet提拱了.NET的分词系统

感谢宝玉解决盘古在Lucene.net3.0中无法使用的问题。

LuceneProject源代码下载

Lucene.net项目研究说明的更多相关文章

  1. Lucene Payload 的研究与应用

    Payload (元数据) 诞生于 Lucene 的2.2 版本,它是在 Lucene 2.1 索引文件格式的基础上扩展而来,提供了一种可以灵活配置的高级索引技术,在某些特定应用场景下能优化基于 Lu ...

  2. AlphaGo 开源项目研究(1)

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50907446 未经博主同意不得转载. 博主地址是:http://blog.csd ...

  3. 谷歌开源可视化工具Facets,将用于人+AI协作项目研究——无非就是一个用于特征工程探索的绘图工具集,pandas可以做的

    见:http://www.infoq.com/cn/news/2017/07/goole-sight-facets-ai https://github.com/PAIR-code/facets/blo ...

  4. Lucene/Solr开发经验

    1.开篇语2.概述3.渊源4.初识Solr5.Solr的安装6.Solr分词顺序7.Solr中文应用的一个实例8.Solr的检索运算符 [开篇语]按照惯例应该写一篇技术文章了,这次结合Lucene/S ...

  5. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...

  6. Lucene.Net 2.3.1开发介绍 —— 二、分词(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(三) 1.3 分词器结构 1.3.1 分词器整体结构 从1.2节的分析,终于做到了管中窥豹,现在在Lucene.Net项目中添加一个类关 ...

  7. Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net

    原文:Lucene.Net 2.3.1开发介绍 -- 一.接触Lucene.Net 1.引用Lucene.Net类库找到Lucene.Net的源代码,在“C#\src\Lucene.Net”目录.打开 ...

  8. iOS上线项目源码分享

    最强UINavigationController和TabBar结合(会员satian )   最强UINavigationController和TabBar结合的Demo,这里取用了明星衣橱app里的 ...

  9. [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目

    (1)项目导入JAR包:1.在项目目录里建立一个libs目录,将外部jar包拷贝在里面.2.右键点击项目,Bulid Path->Configure Build Path3.在设置Libraie ...

随机推荐

  1. C#实例:5个.net经典例子(窗体与界面设计)

    实例001  带历史信息的菜单 实例说明 在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用.如图1.1所示,单击“文件”菜单下的“打开文件”子菜单,打开需要查阅的图纸.下 ...

  2. (转载)C++创建对象的两种方法

    (转载)http://blog.sina.com.cn/s/blog_586b6c050100dhjg.html 在C++里,有两种方法创建对象: 方法一: ClassName object(para ...

  3. 解决Subclipse1.6在64位JDK下不可用的问题

    Failed to load JavaHL Library.  These are the errors that were encountered:   需要下载SVNKit Adapter Sub ...

  4. python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出

    看了一个博客,挺不错的.http://www.cnblogs.com/turtle-fly/p/3280519.html 标准输出(sys.stdout)对应的操作就是print(打印)了,标准输入( ...

  5. [原]RobotFrameWork(四)变量运算与Evaluate

    一.特殊变量运算: 执行结果: 二.Evaluate使用 函数释义:Evaluate是执行python表达式,并返回执行结果 示例1: 执行结果: 示例2: 执行结果: 作者:liuheng12345 ...

  6. sqrt (x) 牛顿迭代法

    参考: 0开方 是 0 1的开方式 1 2的开方式 1.4 3.的开方=(1.4+3/1.4)/2 牛顿迭代法:学习自 http://blog.csdn.net/youwuwei2012/articl ...

  7. Asp.net MVC Razor Generator

    Razor Generator开源工具使用简介: “Razor Generator” 前生“Razor Single File Generator for MVC” 这可以将MVC视图文件[.csht ...

  8. Hdu 5213-Lucky 莫队,容斥原理,分块

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others)    Me ...

  9. InetAddress Example program in Java

    The InetAddress class has no visible constructors. To create an InetAddress object, you have to use ...

  10. HttpClient中post请求http、https示例

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...