最近项目需要全文检索,所以找了几个开源的.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. MySQL源码 数据结构hash

    MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构.下面就来看下hash表的定义: [源代码文件include/hash.h mysys/has ...

  2. bzoj2434

    利用了bzoj3172提到的性质,x串在y串中的出现的次数即为在fail树上以x结尾节点为根的子树中有多少个节点在y串上所以很明显我们要离线解决,我们先把询问按y分类存起来然后我们顺着操作顺序来,出现 ...

  3. BZOJ_1588_&_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1588 给出每一天的营业值,求出之前的天当中与它相差最小的营业值与它的差的绝对值(第一天的差值为 ...

  4. Unity3D之资源问题处理

    你做的东西如果是100%完整版 你就用 流媒体资源 Streaming Assets http://game.ceeger.com/Manual/StreamingAssets.html 你如果是类微 ...

  5. cocos2d-x 使用UIWebView加载网页(顺便可以看到如何用OC调C++)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=248 前段时间项目中要微博授权登 ...

  6. jmap(Memory Map For Java)

    功能   jmap(Memory Map For Java)命令用于生成堆转储快照(一般称为heaphump或dump文件).如果不使用jmap命令,要想获取Java堆转储快照还有一些比较“暴力”的手 ...

  7. Android开发学习笔记:浅谈WebView

    本文转自:http://www.2cto.com/kf/201108/101518.html WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页 ...

  8. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...

  9. 集中式vs分布式

    Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候 ...

  10. python Day 2 - 编写数据库模块

    在一个Web App中,所有数据,包括用户信息.发布的日志.评论等,都存储在数据库中.在awesome-python-app中,我们选择MySQL作为数据库. Web App里面有很多地方都要访问数据 ...