Ads by Lake Quincy Media

eaglet

本博专注于基于微软技术的搜索相关技术
posts - 174, comments - 2977, trackbacks - 26, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

HubbleDotNet 从 2009 年11月份发布第一个版本以来, 只对 0.7 版本做过一次性能对比测试,原因是近一年来,HubbleDotNet一直在做性能优化,截至2010年9月,性能已经优化的差不多了,索引和查询的性能比 0.7 版本时提高了很多倍。这两天重新对HubbleDotNet 与 Lucene.Net 做了性能对比测试。下面就公布一下我的测试数据。

 

测试版本

HubbleDotNet 0.9.7.0

Lucene.Net 2.9.2.1

盘古分词 2.3.1.0

 

测试环境

Intel 双核 1.80 GHz, 2G Ram 笔记本电脑,硬盘转速 5400 转

Windows XP

 

测试数据

测试数据为430万行中文论文数据,索引论文标题和摘要,原始数据大小为 2G。

 

测试方法

索引

HubbleDotNet 采用被动方式 Append Only 模式对论文数据库现有表进行索引。索引后优化。

Lucene.Net 则是从数据库读取记录进行索引,数据存储在Lucene.Net 索引中。索引后优化。

搜索

搜索测试分三个测试用例

1. 测试单个词搜索,不同返回结果集大小时的单次搜索时间

2. 测试多个词同时搜索,不同返回结果集大小时的单次搜索时间

3. 测试相近结果集大小下,不同单词数量的单次搜索时间

 

测试方法为

HubbleDotNet 取消所有缓存设置,循环执行查询语句10次,计算平均值。重复这个过程3次,取最小的时间

Lucene.net 没有设置缓存的地方,所以就直接循环查询 10次,计算平均值。重复这个过程3次,取最小的时间

两者都是返回前25 条记录的 摘要数据,并按得分从大到小排序。

 

测试结果

索引

HubbleDotNet 索引(包括优化) 用时 5200 秒 (0.9 版本)

HubbleDotNet 1.0.1.0 版本索引部分算法又进行了优化,索引(包括优化) 用时 4611 秒

Lucene.net 索引(包括优化) 用时 8700 秒

HubbleDotNet 索引文件大小总和为 1.30 GB

Lucene.net 索引文件大小总和为 3.48GB

搜索

用例1

测试搜索单个单词,结果集大小分别在 10万,20万,50万,100万,200万,400万 级别两者的性能对比。

其中

HubbleDotNet (Match) 指采用Match 方法进行搜索,就是各个单词分量以或的方式匹配。

HubbleDotNet (Cache) 指采用Match 方法进行搜索,并打开数据缓存后的结果。

测试语句示例:

select top 25 docid, abstract from AllIndex where abstract match '基于' order by score desc

 

image

原始数据如下:

Word Result Lucene.net HubbleDotNet
Match
HubbleDotNet
Cache
基于 97539 77.8 40.84 2.38
实验 171383 74.8 57.29 1.57
发展 501510 523 104.59 3.86
918853 114.8 126.95 4.07
. 1956000 191.8 237.99 2.33
3991397 303 380.06 3.72

 

结论:

Lucene.net 在某些词上,不知道为什么会出现毛刺,比如 发展这个词,我重复测了多次,都是 500多毫秒,不知道为什么,可能和其索引的结构有关。

对于结果集大小在50万以内的情况,HubbleDotNet 要比Lucene.net 快不少。

而对于较大结果集,两者差别不大,不过 HubbleDotNet 的搜索算法不会对某些关键词出现毛刺,基本上是一个缓慢递增的过程。

 

用例2

测试搜索7个单词,多关键字查询,结果集大小分别在 15万,40万,80万,150万,300万,400万 级别两者的性能对比。

通常情况下,搜索都是多关键字的,所以这个测试可能更接近实际情况。

其中

HubbleDotNet (Match) 指采用Match 方法进行搜索,就是各个单词分量以或的方式匹配。

HubbleDotNet (Contains) 指采用Contains 方法进行搜索,就是各个单词分量以与的方式匹配。这个测试为和Match 相同关键字情况下的搜索耗时,但由于是与方式,结果集大小会比Match 要小很多。

HubbleDotNet (Cache) 指采用Match 方法进行搜索,并打开数据缓存后的结果。

测试语句示例:

select top 25 docid, abstract from AllIndex 
where abstract match '塑料 构建 数学 群体 毅力 所有' order by score desc
 
select top 25 docid, abstract from AllIndex 
where abstract contains '塑料 构建 数学 群体 毅力 所有' order by score desc

 

image

 

 

测试原始数据:

Word Result Lucene.net HubbleDotNet
Match
HubbleDotNet
Contains
HubbleDotNet
Cache
塑料 构建 数学 群体 毅力 所有 153035 361.8 31.47 8.84 2.02
获得 教育 数学 群体 毅力 所有 408175 419.4 46.37 9.69 2.42
获得 教育 数学 群体 毅力 发展 788078 723.4 81.5 9.09 2.43
获得 教育 数学 个 毅力 发展 1485791 886.4 129.33 15.93 2.45
. 教育 数学 个 毅力 发展 2770563 1211.8 208.56 13.15 2.31
数学 的 教育 个 毅力 发展 4034774 1491.2 285.83 13.39 1.2

结论:

多关键字情况下 HubbleDotNet 比 Lucene.Net 具有明显的优势,Match 方法大概比Lucene.net 快5-10倍,而Contains 方法则比Lucene.net 快上百倍。

 

用例3

测试搜索1个单词到7个单词,结果集大小分别在100万级别时两者的性能对比。

这个测试主要是想看看搜索关键字的数量对搜索效率的影响。

其中

HubbleDotNet (Match) 指采用Match 方法进行搜索,就是各个单词分量以或的方式匹配。

HubbleDotNet (Contains) 指采用Contains 方法进行搜索,就是各个单词分量以与的方式匹配。这个测试为和Match 相同关键字情况下的搜索耗时,但由于是与方式,结果集大小会比Match 要小很多。

HubbleDotNet (Cache) 指采用Match 方法进行搜索,并打开数据缓存后的结果。

 

image

 

测试原始数据:

Word Result Lucene.net HubbleDotNet
Match
HubbleDotNet
Contains
HubbleDotNet
Cache
Number
918853 114.8 126.95 109.74 2.33 1
个 毅力 919277 193.4 57.88 57.52 2.41 2
毅力 个 配方 929364 202.6 63.38 3.86 1.11 3
毅力 个 数学 配方 948084 300.9 59.08 5.31 2.32 4
毅力 个 数学 配方 群体 958049 291.6 64.07 5.54 2.05 5
毅力 个 数学 获得 配方 群体 1032700 330.1 80.59 5.5 1.09 6
毅力 个 数学 获得 配方 群体 密切 1066529 334.6 85.84 5.78 2.35 7

结论:

在单个关键字时,Lucene.net 和 HubbleDotNet 的搜索速度是接近的,但随着关键字的增多,两者的差距就明显增大了,HubbleDotNet 具有明显的优势。

 

附录

Lucene.Net 测试的部分代码

 

            string keywords = q;
 
            IndexSearcher search = new IndexSearcher(indexDir);
            QueryParser queryParser = new QueryParser("abstract", new PanGuAnalyzer());
 
            Query query = queryParser.Parse(q);
 
            Hits hits = search.Search(query);
 
            List<News.TNews> result = new List<News.TNews>();
 
            recCount = hits.Length();
            int i = (pageNo - 1) * pageLen;
 
            while (i < recCount && result.Count < pageLen)
            {
                News.TNews news = new TNews();
                news.Content = hits.Doc(i).Get("abstract");
                result.Add(news);
                i++;
            }
 
            search.Close();
            return result;

这是搜索部分的代码,pageLen = 25

 

相关文章

HubbleDotNet 海量数据测试报告

HubbleDotNet 和 Lucene.Net 匹配相关度的比较 

 

返回 Hubble.net 技术详解

Feedback

#1楼  回复 引用 查看   

2010-09-03 11:57 by 海风吹呀吹      
严重推荐!严重关注!我现在就用的老大的Hubble,非常好用!

#2楼  回复 引用 查看   

2010-09-03 12:48 by jww      
必须支持!

#3楼  回复 引用 查看   

2010-09-03 12:55 by 菩提树下的杨过      
HubbleDotNet 太牛叉了!

支持!

#4楼  回复 引用 查看   

2010-09-03 13:31 by rad      
支持!支持!支持!支持!支持!

#5楼  回复 引用 查看   

2010-09-03 13:34 by Axel      
强烈推荐!
网站已全部迁移到Hubble,原先用的Lucene.net3.2.
当时迁移的理由,Lucene.net索引文件产生错误后维护麻烦,重索引时间长。
另外就是Lucene.net的分类统计(当时我是采用过滤的方式处理)要比Hubble差很多。
还有一个很重要的原因,我对java移植过来的东西从心底里不太感冒。除非我就不用.net架构了。

#6楼  回复 引用 查看   

2010-09-03 13:56 by try      
强大,关注

#7楼  回复 引用 查看   

2010-09-03 14:51 by csdn_li      
好东东记得支持……
这是我的网站!就是用的hubble
www.zhuangyuan123.com

#8楼  回复 引用 查看   

2010-09-03 15:08 by Astar      
现在还没有用,但是以后会用到。推荐。

#9楼  回复 引用 查看   

2010-09-03 15:41 by 小绿      
很好很强大,也准备换这个试试看

#10楼  回复 引用 查看   

2010-09-03 16:01 by 镜涛      
有空研究下

#11楼  回复 引用 查看   

2010-09-03 16:49 by finesite      
现在网站搜索用的是hubble.net 很好很强大
博主知道哪些开源的信息采集模块比较好?

#12楼  回复 引用 查看   

2010-09-03 17:36 by - -||      
支持萨~~~~~~~~~~~~~~~~~~~~

#13楼[楼主]  回复 引用 查看   

2010-09-03 18:01 by eaglet      
@finesite
你试试NCrawler呢。.Net 下的爬虫比较少一些。
另外你做的是哪个网站?

#14楼  回复 引用 查看   

2010-09-03 22:36 by Ray Wu      
近期有打算将google站内换成hubble的打算,看时间了.网站问卷星:http://www.sojump.com/ .搜索页面:http://www.sojump.com/publicsurveys.aspx
使用google搜索有一个好处是不需要消耗服务器性能,但是索引没办法达到实时.

#15楼  回复 引用 查看   

2010-09-03 22:37 by aploo.com      
建议大哥再做一个英文词的测试比较。。。。
毕竟Lucene.net是老外的作品,如果单用中文词比较,好像对Lucene.net有些不公平。。。

如果用英文词也能全面超过,哪就牛叉了。。。

这样就可以让全世界的兄弟都使用Hubble.net 了。。。

#16楼  回复 引用 查看   

2010-09-03 22:57 by 木乃伊      
这个好,俺也去测试下。

#17楼  回复 引用 查看   

2010-09-04 07:59 by sanjer      
HubbleDotNet使用简单方便,功能强大齐全——实在是太好了!!向老大致敬。

#18楼[楼主]  回复 引用 查看   

2010-09-04 10:52 by eaglet      
@aploo.com
英文和中文的区别在索引时英文速度会快,这主要是因为英文的分词比较简单造成的,搜索时英文和中文处理是相同的,没有区别。

#19楼  回复 引用 查看   

2010-09-04 14:52 by Fred_Xu      
好强大啊!支持支持!有机会肯定用用。

#20楼  回复 引用 查看   

2010-09-04 22:54 by 叶鹏      
非常学习,很强大的功能

#21楼  回复 引用 查看   

2010-09-04 23:34 by 无尽思绪      
有测试过单纯的英文(或者单字节语言)下的情况吗?

#22楼[楼主]  回复 引用 查看   

2010-09-05 14:22 by eaglet      
@无尽思绪
英文的测试过段时间来搞,主要是没有比较大的英文数据库。

#23楼  回复 引用 查看   

2010-09-06 09:58 by qlbc      
很好,我的新开发的摄影网站决定用HubbleDotNet,还请老大多多指教。

#24楼[楼主]  回复 引用 查看   

2010-09-06 10:14 by eaglet      
@qlbc
没问题,把你的联系方式发站内短信个我。

#25楼  回复 引用 查看   

2010-09-06 13:46 by 陛下      
发回复对老哥表示祝贺!推广有时比技术本身还要重要,老哥加油!顺便推荐一下!

#26楼  回复 引用 查看   

2010-09-07 09:19 by Adam哥      
不知道这个实时搜索方面怎么样呢

#27楼  回复 引用 查看   

2010-09-09 09:50 by eng308      
@csdn_li
晕 你可以不用给你的网站打广告的。。 酷酷

#28楼[楼主]  回复 引用 查看   

2010-09-09 11:22 by eaglet      
@eng308
公布一下哪个网站在使用挺好啊,可以让别人知道Hubble 有实际的商业项目在用。目前hubble已经有将近600个用户在用,不过大部分都没有向我汇报,都在偷偷的玩,嘿嘿。不管有没有和我联系,都是我的用户,我都要表示感谢,虽然我也是免费大派送,不过你们的使用就是对我无言的支持和肯定。

#29楼  回复 引用 查看   

2010-09-09 11:47 by finesite      
引用eaglet:
@finesite
你试试NCrawler呢。.Net 下的爬虫比较少一些。
另外你做的是哪个网站?

好的,我试试,由于没试过虚拟主机,我是用自己的电脑做局域网用Hubble.net的

#30楼  回复 引用 查看   

2010-09-10 11:08 by eng308      
@eaglet
哈哈 老大激动了 我和酷酷认识的 和他开玩笑的
Hubble.net确实是个好东西,相对luncene.net而言,简单易上手而不缺乏性能。嘿嘿 现在我的一些朋友在用搜索方面的我都力推hubble.net

#31楼[楼主]  回复 引用 查看   

2010-09-10 11:31 by eaglet      
@eng308
非常感谢你的支持!

#32楼  回复 引用 查看   

2010-11-09 02:21 by ucfar      
说了那么多,可以搞一下完整的demo吗?晕

#33楼[楼主]  回复 引用 查看   

2010-11-09 09:41 by eaglet      
@ucfar
主页上不是有Demo的文档吗?还有源码里面也有Demo。不知道你需要什么样的 Demo,我抽空做一个。

#34楼  回复 引用 查看   

2010-11-17 08:27 by 鸿慧      
@eaglet
向老大 致敬!

#35楼  回复 引用 查看   

2010-11-17 17:01 by xiangxiang      
Hubble.net的索引,搜索的原理是什么,是您完全自己独立开发的全文检索引擎,还是基于lucene.net上的APP管理工具包?

#36楼  回复 引用 查看   

2010-11-17 17:05 by xiangxiang      
Hubble.net和solr有什么区别,是不是.net下的solr?

#37楼[楼主]  回复 引用 查看   

2010-11-18 06:55 by eaglet      
@xiangxiang
是完全独立开发的全文搜索引擎,架构上借鉴了 lucene 的一些设计思路,核心算法是参考斯坦福大学的搜索引擎教材并结合实际情况开发的,和lucene.net,solr 没有任何关系。

#38楼  回复 引用 查看   

2010-11-19 10:46 by 推土机soft      
牛逼!支持国产!

#39楼  回复 引用 查看   

2010-12-30 10:46 by gaoranbb      
请问现在有没有关于多表查询的资料呢?只能单表查询码?
多表查询这个很重要

#40楼[楼主]  回复 引用 查看   

2010-12-30 13:58 by eaglet      
@gaoranbb
不知道你说的多表查是什么意思,目前可以支持多表联合查询。但如果是主次表的关联查询,目前还不能支持。

#41楼  回复 引用 查看   

2010-12-30 14:33 by gaoranbb      
另外,建立索引文件后,数据库源那里也会出现个相同的表,这样就造成源数据库文件过大,这个问题有办法解决没?

#42楼[楼主]  回复 引用 查看   

2010-12-30 17:46 by eaglet      
@gaoranbb
不会有相同的表出现的。如果你用被动模式,那么HubbleDotNet对数据库源 根本不会进行任何写操作。

#43楼  回复 引用 查看   

2011-11-06 21:38 by ZhZhen      
请问楼主,HubbleDotNet是否支持对文档的索引?