[文章作者:张宴 本文版本:v1.0 最后修改:2008.07.27 转载请注明原文链接:http://blog.zyan.cc/post/360/]

  前言:本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜索引擎)架构。本文只列出前几章的内容节选,不提供全文内容。

  在DELL PowerEdge 6850服务器(四颗64 位Inter Xeon MP 7110N处理器 / 8GB内存)、RedHat AS4 Linux操作系统、MySQL 5.1.26、MyISAM存储引擎、key_buffer=1024M环境下实测,单表1000万条记录的数据量(这张MySQL表拥有int、datetime、varchar、text等类型的10多个字段,只有主键,无其它索引),用主键(PRIMARY KEY)作为WHERE条件进行SQL查询,速度非常之快,只耗费0.01秒。

  出自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

  基于以上几点,我设计出了这套搜索引擎架构。在生产环境运行了一周,效果非常不错。有时间我会专为配合Sphinx搜索引擎,开发一个逻辑简单、速度快、占用内存低、非表锁的MySQL存储引擎插件,用来代替MyISAM引擎,以解决MyISAM存储引擎在频繁更新操作时的锁表延迟问题。另外,分布式搜索技术上已无任何问题。



  一、搜索引擎架构设计:
  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自带的中文分词词库。



  二、MySQL+Sphinx+SphinxSE安装步骤:
  1、安装python支持(以下针对CentOS系统,其他Linux系统请使用相应的方法安装)
yum install -y python python-devel


  2、编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词词库。)

  以下压缩包“sphinx-0.9.8-rc2-chinese.zip”中包含mmseg-0.7.3.tar.gz、sphinx-0.9.8-rc2.tar.gz以及中文分词补丁。


unzip sphinx-0.9.8-rc2-chinese.zip
tar zxvf mmseg-0.7.3.tar.gz
cd mmseg-0.7.3/
./configure
make
make install
cd ../


  3、编译安装MySQL 5.1.26-rc、Sphinx、SphinxSE存储引擎
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.26-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/
tar zxvf mysql-5.1.26-rc.tar.gz

tar zxvf sphinx-0.9.8-rc2.tar.gz
cd sphinx-0.9.8-rc2/
patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch
patch -p1 < ../fix-crash-in-excerpts.patch
cp -rf mysqlse ../mysql-5.1.26-rc/storage/sphinx
cd ../

cd mysql-5.1.26-rc/
sh BUILD/autorun.sh
./configure --with-plugins=sphinx --prefix=/usr/local/mysql-search/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile
make && make install
cd ../

cd sphinx-0.9.8-rc2/
CPPFLAGS=-I/usr/include/python2.4
LDFLAGS=-lpython2.4
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql-search
make
make install
cd ../

mv /usr/local/sphinx/etc/sphinx.conf /usr/local/sphinx/etc/sphinx.conf.old




  第二章第3节之后的正文内容不予公布,全文的目录如下(共24页):

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片

  点击在新窗口中浏览此图片



  2010年2月5日增加:

  文档全文请访问: http://blog.zyan.cc/sphinx_search/







技术大类 » 搜索引擎技术 | 评论(154) | 引用(0) | 阅读(257927)
shunz
2009-11-13 14:01
真晕,sphinxsearch.com的域名竟然过期了,上哪下载去啊?
aiway
2009-11-13 19:14
make[2]: *** [mmseg] Error 1
make[2]: Leaving directory `/root/mmseg-0.7.3/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/mmseg-0.7.3'
make: *** [all] Error 2
请问 我安装时出现这样的问题 能帮忙解决下吗?万分感谢
果樣綠茶
2009-12-1 23:25
張宴你好 我最近在做電子商務的搜索引擎遇到些難題 拜讀這一份文章深感佩服  不知怎樣才可以詳讀全文
macmillan Email
2009-12-13 00:58
张宴你好,关注你的博客好久了,现在遇到些问题需要sphinx的比较详细的文档,拜求此详细文档可以吗?邮箱是 sucrede@gmail.com ,非常感谢。
techice
2009-12-18 17:09
哥们  迫切的想拜读你的全文 ..
55
2010-1-4 12:29
grincrydoglovekillshockshuaiquestionsmokesleepyenvyshyquestionsleepysleepyshockquestionpukesleepy
hawer
2010-1-4 21:49
顶!顶!顶!顶!顶!顶!FAG轴承
jertwewe
2010-1-9 23:11
顶!顶!顶!顶!顶!顶!INA轴承
网上赚钱 Email Homepage
2010-1-11 11:10
楼主辛苦了,谢谢分享!
<a href="http://www.v15968.cn/">网上赚钱</a>
<a href="http://www.cash1688.cn/">网赚教程</a>
2010-1-11 13:53
真小家子气,Sphinx都开源,你不过是对Sphinx做了点研究,就小气成这样,这也保密,那也保密。
自己的东西不愿意让别人知道,但是却忍不住虚荣一下,让别人知道你有本事,这就是你这篇文章的真正意思吧?
Weston
2010-1-23 00:48
真小家子气,Sphinx都开源,你不过是对Sphinx做了点研究,就小气成这样,这也保密,那也保密。自己的东西不愿意让别人知道,但是却忍不住虚荣一下,让别人知道你有本事,这就是你这篇文章的真正意思吧?===================================================这是人家的劳动成果,人家爱分享就分享,要不你也分享你的东西出来啊
无聊
2010-2-1 19:28
真小家子气,Sphinx都开源,你不过是对Sphinx做了点研究,就小气成这样,这也保密,那也保密。
自己的东西不愿意让别人知道,但是却忍不住虚荣一下,让别人知道你有本事,这就是你这篇文章的真正意思吧?

--------------------
的确如此!
鑫燕
2010-3-14 19:39
张兄,这个构架,能不能放一个简化版的教程出来给我们学习一下?
benson
2011-4-20 16:02
张大师,能分享一份吗,最近工作需要涉及到sphinx,mail: bensonzy@126.com
iterse's blog Homepage
2011-5-13 09:08
很强大,谢谢分享!
persy Email
2011-9-1 15:08
张老师,数据库为GBK,sphinx只能按 utf8 建索引,索引文件必须以 utf8 存,生成索引的数据源必须是utf8的

“test中文”
[words] => Array
        (
            [test] => Array
                (
                    [docs] => 3
                    [hits] => 5
                )

        )
中文没了,请问是打补丁还是其他方式可以解决,如果打补丁,应该如何做,谢谢
大傻 Email
2011-10-17 22:33
张老师写的很好,但是sphinx低版本中在window系统中存在严重的内存溢出问题,而且即使是coreseek的分词也不是很理想,面对分词不如意的情况我们自己嵌入了ictclas分词系统!可是内存溢出问题就悲剧了。。。
video2lady Email Homepage
2011-10-18 09:55
Convert dvd to itunes
Q: How can i put DVD movies into itunes for iPod/iPhone/iPad?
A: Use DVD Ripper to convert DVD to iTune video formats with excellent output quality.
dvdtolovez Email Homepage
2011-10-18 11:21
Convert dvd to itunes
Q: How can i put DVD movies into itunes for iPod/iPhone/iPad?
A: Use DVD Ripper to convert DVD to iTune video formats with excellent output quality.
dvdtolovem Email Homepage
2011-10-18 11:22
Rip Blu-ray to Windows Mobile video with Holeesoft Blu-ray to Windows Mobile Ripper
Have you found an easy way to transfer blu-ray disc into Windows Mobile video format? Holeesoft Blu-ray to Windows Mobile converter is made especially for windows users, which allows you to convert blu-ray movie to WMV, MPEG4 (.mp4) Windows Mobile video formats file.
Holeesoft Blu-ray to Windows Mobile Ripper Main Functions
1. Convert Blu-ray to WMV, MPEG4 (.mp4) Windows Mobile video format.
2. Output Devices Supported: Windows Mobile including Zune, Creative Zen, Pocket PC, Palm, HP iPAQ.
http://download.cnet.com/Holeesoft-Blu-ray-to-Windows-Mobile-Ripper/3000-7970_4-75448231.html
分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]