热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(转)HubbleDotNet和Lucene.net性能对比测试

HubbleDotNet从2009年11月份发布第一个版本以来,只对0.7版本做过一次性能对比测试,原因是近一年来,HubbleDotNet一直在做性能优化,截至2010年9月

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

 

,

原始数据如下:

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

 

,

 

 

测试原始数据:

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 方法进行搜索,并打开数据缓存后的结果。

 

,

 

测试原始数据:

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 result = new List();
 
            recCount = hits.Length();
            int i = (pageNo - 1) * pageLen;
 
            while (i 
            {
                News.TNews news = new TNews();
                news.COntent= hits.Doc(i).Get("abstract");
                result.Add(news);
                i++;
            }
 
            search.Close();
            return result;

 

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

 

转载自:http://www.cnblogs.com/eaglet/archive/2010/09/03/1816856.html

(转)HubbleDotNet 和 Lucene.net 性能对比测试,,

(转)HubbleDotNet 和 Lucene.net 性能对比测试


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
author-avatar
手机用户3312丿075454
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有