越来越多“搜”主意-Spinx Search
发表于03.21, 2010 | 作者:joey | 栏目: 超凡呐喊 | 短缩网址:
我看到很多IT经理人的案前,都有很多知名的书籍,《蓝海战略》、《长尾理论》、《维基经济学》,闲来无事,还分享一下《蓝海战略》的读书心得,然而自己却做年年月月地做个跟屁虫,克隆着网络上最流行的应用,我不敢批评蓝海战略之漏洞,只是在一个市场上,只有要专注的决心,不怕正面竞争。所以我最佩服的是Google,在当年搜索引擎林立,还能脱颖而出,我也不好意思说我当年在网易,还看到丁磊先生风风火火地让同事们在搜索引擎上下苦功,一定要把“边城浪子”找出来才作准,然而我们还是输了,连Yahoo都退而求次,更何况国内的公司。
Google的成功带动了所有人都趋之若鹜,都希望自己做搜索引擎,机器人、爬虫、蜘蛛、全文搜索更是开发者认为的点金石,纷纷下海研究起来,于是有了一片搜索热,当时让大家觉得“惊艳”的,一定要数Apache的项目Lucene,Lucene的名字是作者Doug Cutting的妻子的名字,所以我说惊艳是没错的,Lucene让我们建立自己的搜索引擎不再是梦想,它能支持TB级别的数据量,而其而搜索速度惊人,前段时间跟网易的开发人员聊天,他们也采用Lucene来提升数据库的查询效率,然而Lucene是一个JAVA项目,它的Solr能让JAVA开发人员得心应手,而对于PHP开发者,最终也有方案,让PHP开发者一尝心愿,连Zend Framework都有支持Lucene的类,不过对于我们热爱LAMP开发的人来说,本来不需要安装JDK,如果使用Lucene还是得乖乖地安装JDK去运行Lucene,心里总有不甘。
现在网上又有一个搜主意,那就是Spinx,Spinx名字很特别,因为它乃是大名鼎鼎埃及狮身人面像,我觉得这个名字寓意不错,Spinx项目在2001年已开始,到2009年末才提供稳定的版本下载,所以它算是新鲜出炉的香饽饽,来自俄罗斯的开发造诣,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
一、搜索引擎架构设计:
1、搜索引擎架构图:
2、搜索引擎架构设计思路:
(1)、调用方式最简化:
尽量方便前端Web工程师,只需要一条简单的SQL语句“SELECT … FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query=’…’;”即可实现高效搜索。
(2)、创建索引、查询速度快:
①、Sphinx Search 是由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。
Sphinx的特征:
- Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒)
- 高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果)
- 高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录)
- 支持分布式检索
- 支持基于短语和基于统计的复合结果排序机制
- 支持任意数量的文件字段(数值属性或全文检索属性)
- 支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”)
- 支持作为Mysql的存储引擎
②、通过国外《High Performance MySQL》专家组的测试可以看出,根据主键进行查询的类似“SELECT … FROM … WHERE id = …”的SQL语句(其中id为PRIMARY KEY),每秒钟能够处理10000次以上的查询,而普通的SELECT查询每秒只能处理几十次到几百次:
③、Sphinx不负责文本字段的存储。假设将数据库的id、date、title、body字段,用sphinx建立搜索索引。根据关键字、时 间、类别、范围等信息查询一下sphinx,sphinx只会将查询结果的ID号等非文本信息告诉我们。要显示title、body等信息,还需要根据此 ID号去查询MySQL数据库,或者从Memcachedb等其他的存储中取得。安装SphinxSE作为MySQL的存储引擎,将MySQL与 Sphinx结合起来,是一种便捷的方法。
创建一张Sphinx类型表,将MyISAM表的主键ID和Sphinx表的ID作一个JOIN联合查询。这样,对于MyISAM表来所,只相当于 一个WHERE id=…的主键查询,WHERE后的条件都交给Sphinx去处理,可以充分发挥两者的优势,实现高速搜索查询。
(3)、按服务类型进行分离:
为了保证数据的一致性,我在配置Sphinx读取索引源的MySQL数据库时,进行了锁表。Sphinx读取索引源的过程会耗费一定时间,由于 MyISAM存储引擎的读锁和写锁是互斥的,为了避免写操作被长时间阻塞,导致数据库同步落后跟不上,我将提供“搜索查询服务”的和提供“索引源服务”的 MySQL数据库进行了分开。监听3306端口的MySQL提供“搜索查询服务”,监听3406端口的MySQL提供“索引源服务”。
(4)、“主索引+增量索引”更新方式:
一般网站的特征:信息发布较为频繁;刚发布完的信息被编辑、修改的可能性大;两天以前的老帖变动性较小。
基于这个特征,我设计了Sphinx主索引和增量索引。对于前天17:00之前的记录建立主索引,每天凌晨自动重建一次主索引;对于前天17:00 之后到当前最新的记录,间隔3分钟自动重建一次增量索引。
(5)、“Ext3文件系统+tmpfs内存文件系统”相结合:
为了避免每3分钟重建增量索引导致磁盘IO较重,从而引起系统负载上升,我将主索引文件创建在磁盘,增量索引文件创建在tmpfs内存文件系统 “/dev/shm/”内。“/dev/shm/”内的文件全部驻留在内存中,读写速度非常快。但是,重启服务器会导致“/dev/shm/”内的文件丢 失,针对这个问题,我会在服务器开机时自动创建“/dev/shm/”内目录结构和Sphinx增量索引。
(6)、中文分词词库:
根据“百度早期中文分词库”+“搜狗拼音输入法细胞词库”+“LibMMSeg高频字库”+… 综合整理成一份中文分词词库,你也可以使用LibMMSeg自带的中文分词词库。
最后推荐国内开发者Dony的文章:打造基于PHP的Sphinx全文搜索引擎 – http://www.corrie.net.cn/e/1181.htm
v: 2670[-JOEY BLOGGER - AD广告-]

相关文章
:full-text, java, lucene, php, search, spinx












