[同事原创] 开源搜索引擎Hyper Estraier性能小测&缺点总结

万俟铭
2023-12-01

 

 

开源搜索引擎Hyper Estraier性能小测&缺点总结
      作者:chin

 


Hyper Estraier是一个由日本人用C写的搜索引擎,底层存储采用了作者另外一个 开源项目QDBM。
在功能特性上,Hyper Estraier是比较接近iSearch (alibaba内部平台搜索产品) 的,支持Attribue Search,N- gram,P2P(不是下片的P2P啊,就是可以有很多节点,节点之间可以通信),甚至 支持正则。。。BT的说。

六月份的时候我用Larbin抓取了数百万网页,build了索引,做了一下性能测试, 测试数据简单总结如下:
一、html页面数共74,329M,约74G
[chin@lily ~]$ tail -n 3 nohup.out
96      save/d00330
106     save/d00814
74329   save/


二、build完之后,索引文件约19G,加上其他数据一共约26G
1096    ./_attr
19044   ./_idx
5727    ./_text
2       ./_kwd


三、build非常耗时,这点数据量,估计花了72小时才build完,我没准确计时,但 感觉脚本运行了三天才跑完,服务器load average 2左右,不build索引的时候 load average在0.05左右,我用的是这个shell:

for ((DIR=001;DIR<1000;DIR++))
do
   echo "Now gathering html in d00"$DIR
   rm tmp_index -rf
   find "/usr/local/larbin/save/d00"$DIR -type f | estcmd gather -fh -cl tmp_index - > /dev/null
   estcmd merge chn_html tmp_index > /dev/null
done


红色部分是关键,不知道“find命令查找html文件”是不是瓶颈,用he索引php和 mysql的html手册还是挺快的。

四、查询速度是亚秒级的,似乎有缓存,排序慢,计算相似度(similar page)很 慢,猜测是build索引的时候干的活儿少,所以查询的时候很多东西要临时计算
[chin@lily he]$ estcmd search -max 1 chn_html "yahoo ncp"
--------[38B113D56972756D]--------
VERSION 1.0
NODE    local
HIT     6
HINT#1  yahoo ncp       6
TIME    0.663100
DOCNUM  2514538
WORDNUM 17904280
VIEW    ID
本次搜索关键词是“yahoo ncp”,在251万个文档中命中6个,耗时663毫秒

[chin@lily he]$ estcmd search -max 1 chn_html "yahoo"
--------[6C8156340E89C849]--------
VERSION 1.0
NODE    local
HIT     59707
HINT#1  yahoo   59707
TIME    0.051943
DOCNUM  2514538
WORDNUM 17904280
VIEW    ID
[chin@lily he]$ estcmd search -max 1 chn_html "ncp"
--------[5B1ED19D1C5AB56C]--------
VERSION 1.0
NODE    local
HIT     1362
HINT#1  ncp     1362
TIME    0.003320
DOCNUM  2514538
WORDNUM 17904280
VIEW    ID

第二次搜yahoo或ncp就快很多了,因此我猜是有缓存的

HE的缺点:
1.没有像样的社区。
作者很猛很持久,搞了一系列开源项目,但似乎没有人跟他一起开发。有人贡献其 他语言的API,比如PHP的api就是。

2.文档简单但不详尽。
看得出来,这个日本哥们的英文也不咋地,对我们这种非英语母语的人来说是个好 事,文档很容易阅读,不过实施的时候有写细节需要连猜带蒙。文档里甚至有些错误。

3.某些功能特性缺失,比如stop word,同根词,group by(看http: //fuwu.cn.yahoo.com,随便搜个关键词,它会告诉你各个分类下有多少满足条件 的结果)。也没有分词,不过分词可以独立出来,也容易改他的源代码重编译。

4.代码结构一般。
C代码,流程控制比较扁平(充斥大量if,else),感觉没什么封装,也谈不上什么 设计模式。坏处是代码复用不够,会有些冗余,给hack带来一些困难。好处是比较 容易看明白,无需借助SourceInsight之类的东东。

另外,我在这里搭了个PHP,MySQL手册的搜索:http://www.example.com.cn/ 可以去体验一下。


XRL的回复:
根据我阅读部分代码的结果,并不推荐大家用它做实际开发
小改一下还行,但是其结构实在太.....适于一两个高手埋头猛搞,不适合拿到一个公司、团队做为项目进行


YYQ的补充:
如果是采用在内存中构建“搜索词 文档ID列表”,然后把用户输入的词分开去一一对应,最后再根据文档ID(也可能是偏移量)去大的索引文件里面去查找,性能应该比这个至少快1个数量级(而且是不用任何缓存机制的前提下)。
不知道Hyper Estraier是怎么实现的,但是从结果上来看性能不好。


原文地址:http://chin.bokee.com/6784704.html

 

相关说明:
官方网站:http://hyperestraier.sourceforge.net
中文教程:http://www.162cm.com/archives/tag/hyperestraier

 

 

PS:
Hyper Estraier 的作者Mikio Hirabayashi是个强人,做了很多开源项目,包括QDBMTokyo CabinetDiqtRBBS 等,最近据说Tokyo Cabinet风头很劲

 


 

 

 类似资料: