Lucene.net项目研究说明
最近项目需要全文检索,所以找了几个开源的.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中无法使用的问题。
Lucene.net项目研究说明的更多相关文章
- Lucene Payload 的研究与应用
Payload (元数据) 诞生于 Lucene 的2.2 版本,它是在 Lucene 2.1 索引文件格式的基础上扩展而来,提供了一种可以灵活配置的高级索引技术,在某些特定应用场景下能优化基于 Lu ...
- AlphaGo 开源项目研究(1)
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50907446 未经博主同意不得转载. 博主地址是:http://blog.csd ...
- 谷歌开源可视化工具Facets,将用于人+AI协作项目研究——无非就是一个用于特征工程探索的绘图工具集,pandas可以做的
见:http://www.infoq.com/cn/news/2017/07/goole-sight-facets-ai https://github.com/PAIR-code/facets/blo ...
- Lucene/Solr开发经验
1.开篇语2.概述3.渊源4.初识Solr5.Solr的安装6.Solr分词顺序7.Solr中文应用的一个实例8.Solr的检索运算符 [开篇语]按照惯例应该写一篇技术文章了,这次结合Lucene/S ...
- Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(三)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(三) 1.3 分词器结构 1.3.1 分词器整体结构 从1.2节的分析,终于做到了管中窥豹,现在在Lucene.Net项目中添加一个类关 ...
- Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net
原文:Lucene.Net 2.3.1开发介绍 -- 一.接触Lucene.Net 1.引用Lucene.Net类库找到Lucene.Net的源代码,在“C#\src\Lucene.Net”目录.打开 ...
- iOS上线项目源码分享
最强UINavigationController和TabBar结合(会员satian ) 最强UINavigationController和TabBar结合的Demo,这里取用了明星衣橱app里的 ...
- [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目
(1)项目导入JAR包:1.在项目目录里建立一个libs目录,将外部jar包拷贝在里面.2.右键点击项目,Bulid Path->Configure Build Path3.在设置Libraie ...
随机推荐
- C#实例:5个.net经典例子(窗体与界面设计)
实例001 带历史信息的菜单 实例说明 在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用.如图1.1所示,单击“文件”菜单下的“打开文件”子菜单,打开需要查阅的图纸.下 ...
- (转载)C++创建对象的两种方法
(转载)http://blog.sina.com.cn/s/blog_586b6c050100dhjg.html 在C++里,有两种方法创建对象: 方法一: ClassName object(para ...
- 解决Subclipse1.6在64位JDK下不可用的问题
Failed to load JavaHL Library. These are the errors that were encountered: 需要下载SVNKit Adapter Sub ...
- python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出
看了一个博客,挺不错的.http://www.cnblogs.com/turtle-fly/p/3280519.html 标准输出(sys.stdout)对应的操作就是print(打印)了,标准输入( ...
- [原]RobotFrameWork(四)变量运算与Evaluate
一.特殊变量运算: 执行结果: 二.Evaluate使用 函数释义:Evaluate是执行python表达式,并返回执行结果 示例1: 执行结果: 示例2: 执行结果: 作者:liuheng12345 ...
- sqrt (x) 牛顿迭代法
参考: 0开方 是 0 1的开方式 1 2的开方式 1.4 3.的开方=(1.4+3/1.4)/2 牛顿迭代法:学习自 http://blog.csdn.net/youwuwei2012/articl ...
- Asp.net MVC Razor Generator
Razor Generator开源工具使用简介: “Razor Generator” 前生“Razor Single File Generator for MVC” 这可以将MVC视图文件[.csht ...
- Hdu 5213-Lucky 莫队,容斥原理,分块
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others) Me ...
- InetAddress Example program in Java
The InetAddress class has no visible constructors. To create an InetAddress object, you have to use ...
- HttpClient中post请求http、https示例
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...