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

  前言:

  2008年7月,我写过一篇文章《基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计》。有不少网友希望阅读全文,我将该文档整理了一下,分享出来。文档解压后大小为7.33M,共19页。

  本站下载地址: http://blog.zyan.cc/book/sphinx/sphinx_mysql.zip

  新浪下载分流: http://ishare.iask.sina.com.cn/f/6728201.html

  上述文档架构存在的局限,我在2008年12月的文章《亿级数据的高并发通用搜索引擎架构设计》中已经指出:一是MySQL本身的并发能力有限,在200~300个并发连接下,查询和更新就比较慢了;二是由于MySQL表的主键与Sphinx索引的ID一一对应,从而无法跨多表建立整站查询,而且新增加类别还得修改配置文件,比较麻烦;三是因为和MySQL集成,无法发挥出Sphinx的优势。虽然如此,但对于一些写入量不大的搜索应用,已经足够了,或许对很多人会有帮助。



  正文:

  在这之后,本人基于《亿级数据的高并发通用搜索引擎架构设计》开发的Sphinx分布式通用站内搜索引擎平台,已经在生产环境运行9个月以上,经过运营中的不断完善与改进,目前已形成了一套可扩展的分布式通用站内搜索引擎框架。CMS、视频、论坛等产品发生的增、删、改操作,文本内容实时写入自行开发的 HTTPSQS 高性能简单消息队列服务,通过队列控制器更新索引和存储。提供支持XML、JSON的API查询接口,支持亿级数据的索引、分布式、中文分词、高亮显示、自动摘要、准实时(1分钟内)增量索引更新。

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

  下面是Sphinx新的搜索架构中技术关键点实现方式的一些介绍,与大家分享、交流一下:

  1、一元分词和中文分词的结合:

  ①、一元分词位于索引更新模块。Sphinx索引引擎对于CJK(中日韩)语言(必须是UTF-8编码)支持一元切分,假设【反恐行动是国产主视角射击网络游戏】这段文字,Sphinx会将其切成【反 恐 行 动 是 国 产 主 视 角 射 击 网 络 游 戏】,然后对每个字建立反向索引。如果用这句话中包含的字组成一个不存在的词语,例如【恐动】,也会被搜索到,所以搜索时,需要加引号,例如搜索【"反恐行动"】,就能完全匹配连在一起的四个字,不连续的【"恐动"】就不会被搜索到。但是,这样还有一个问题,搜索【"反恐行动游戏"】或【"国产网络游戏"】就会搜索不到。对于这个问题,采用位于搜索查询模块的中文分词来处理。

  sphinx.conf配置文件中关于UTF-8中文一元分词的配置如下:
...省略...
index t_source_main
{
        source                  = t_source_main
        path                    = /data0/search/sphinx/data/t_source_main
        docinfo                 = extern
        mlock                   = 0
        morphology              = none
        min_word_len            = 1
        charset_type            = utf-8
        min_prefix_len          = 0
        html_strip              = 1
        charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
        ngram_len               = 1
        ngram_chars             = U+3000..U+2FA1F
}
...省略...


  ②、中文分词位于搜索查询模块。搜索“反恐行动游戏”、“国产网络游戏”,先调用独立的中文分词系统,分别切分为“反恐行动 游戏”、“国产 网络游戏”,这时候,再给以空格分隔的词语加上引号,去Sphinx搜索【"反恐行动" "游戏"】或【"国产" "网络游戏"】,就能搜索到这条记录了。中文分词词库发生增、删、改,无需重建整个Sphinx搜索索引。



  2、使用自行开发的HTTPSQS(http://code.google.com/p/httpsqs)开源简单队列服务程序,来缓冲高并发数据写入

  新闻、论坛帖子、客服公告、SNS社区等发生的增、删、改操作,文本内容通过更新接口实时写入HTTPSQS队列,再通过队列控制器更新到Sphinx搜索引擎索引中。



  3、Sphinx不能严格按照字段排序的小问题

  如果不想使用权重,只希望严格按照时间、主键等排序,而匹配模式(Matching modes)又为非SPH_MATCH_BOOLEAN时(比较常用的是SPH_MATCH_ALL、SPH_MATCH_EXTENDED),Sphinx搜索结果在某一页中的排序会不太准确。例如:按照UNIX时间戳倒序排序,0,20为第一页,20,40为第二页,第一页的最小时间戳一定会大于第二页的最大时间戳,但是,第一页中的0,20条记录却不会严格按照时间戳排序,第二页亦是如此。因此,如果需要精确排序,用户翻到搜索结果的某一页,就需要对Sphinx在某一搜索结果页中的记录另行再排序,在我的这套搜索架构中,这一再排序操作由search.php查询接口使用array_multisort()函数处理。一般情况下,一页只会显示5~30条记录,因此,只对几十条记录采用PHP再排序,速度也是非常快的。



  4、队列控制器中“时间控制”与“数量控制”相结合,实现搜索索引的1分钟内准实时更新:

  ①、Sphinx 0.9.9生产环境的建索引速度大约在5.5 Mbytes/秒、6400文档/秒。队列控制器可以设置10秒钟更新一次增量索引,只要Sphinx增量索引数据源的文档数在38万以内,就能保证增量索引在1~60秒内得到更新,这是从“时间”上进行控制。

  ②、为了避免增量索引数据源的文档数增长到38万,队列控制器在增量索引数据源的文档数超过1万时,还将激活增量索引合并入主索引的操作,合并完成的文档将从增量索引数据源中删除,这是从“数量”上进行控制。



  5、自行编写的“搜索引擎查询API接口”调用说明:
http://xxx.xxx.xxx.xxx/search.php?query=%E9%87%91%E5%B1%B1  (搜索关键字。程序能够识别关键字是GBK编码还是UTF-8编码,能够识别关键字是否进行了URL编码)
&output=xml  (输出类型支持:xml 或 json)
&excerpts=1  (是否开启高亮显示与文本摘要,1开启 或 0关闭)
&excerpts_before=<font color=red>  (高亮显示与文本摘要,如果为空值则不进行高亮显示与文本摘要。在匹配的关键字前面插入的字符串。)
&excerpts_after=</font>  (高亮显示与文本摘要,如果为空值则不进行高亮显示与文本摘要。在匹配的关键字之后插入的字符串。)
&excerpts_limit=256  (高亮显示与文本摘要,如果为空值则不进行高亮显示与文本摘要。摘要最多包含的符号(码点)数。)
&excerpts_field=c1,c2,c3,c4,c5  (仅对指定的字段进行高亮显示,其余字段不进行高亮显示,如果此参数为空,则默认所有的字符型字段都进行高亮显示)
&offset=0&limit=20  (相当于SQL语句中的limit 0,20)
&max_matches=30000  (最大搜索结果集数量)
&match_mode=SPH_MATCH_EXTENDED2
&ranking_mode=SPH_RANK_PROXIMITY_BM25
&sort_mode=SPH_SORT_EXTENDED&sort_by=@relevance DESC,u1 ASC,@id DESC  (排序模式:@relevance和@id是内置变量,@relevance代表相关度权值,@id等于search_id,u1为字段名)
&field_weights=c1,7;c2,1  (权重设置:字段c1的权重为7,字段c2的权重为1)
&filter=u1:0_1_6,false;u2:4,true  (整数值过滤器:匹配字段u1等于0、1或6,并且字段u2不等于4的结果集。false表示等于,true表示不等于)
&filter_range=u1:0,100,false;u2:50,90,true  (整数范围过滤器:字段u1 >= 0并且u1 <= 100,字段u2 < 50并且u2 > 90)
&filter_range=u1:1.23,99.645,false;u2:1034.3,7834.56,true  (浮点数范围过滤器:字段u1 >= 1.23并且u1 <= 99.645,字段u2 < 1034.3并且u2 > 7834.56)




  6、搜索结果前台页面示例:

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



  7、同一套服务器平台与API接口,通用于各类产品:

  示例:

  金山游戏文章与视频搜索:http://s.xoyo.com/result.php?w=%E5%89%91%E7%BD%913

  金山游戏论坛帖子搜索:http://jx3.bbs.xoyo.com/search2.php?srchtxt=%E4%B8%83%E7%A7%80&select=title


Tags: , ,



技术大类 » 搜索引擎技术 | 评论(89) | 引用(0) | 阅读(150280)
haibo600
2011-7-18 11:53
sphinx的分布式主键索引重复怎么解决
song
2011-10-10 10:50
感谢前辈的无私贡献
gs Email Homepage
2011-10-13 14:28
实验中.
hsjz81
2011-10-21 11:34
非常不错。。。。顶一下
Thinking
2011-11-10 18:20
我实施的时候采用一元切分,按照您说的“去Sphinx搜索【"反恐行动" "游戏"】或【"国产" "网络游戏"】"的方法貌似搜索不出数据,改用(反恐行动)|(游戏)或(国产)| (网络游戏)貌似能得到想要的数据。
louis vuitton uk Email Homepage
2011-11-23 09:30
This louis vuitton uk for sale belongs to the sounding just what are termed as Louis Vuitton vintage best sellers, many other products and services for the reason that range appearing companies.You will easily notice the unfold zippers of this coach outlet store online. That is the decoration. There are some inside pockets for you as well. They are easy to match your clothes and to carry.Let us inspire your inner beauty with fine christian louboutin sale. Purse the elegance in bridal wedding. Enjoy the fashion.
wedding520 Email Homepage
2011-12-27 15:57
ワイドネックライン、'V'ネックやボートネックラインは、一般にキャップスリーブとドレスのために選ばれている。ボートスタイルのネックラインと幅広いネックラインのためには、オフショルダーのキャップスリーブを追加することができます。オフショルダーのウエディングドレスは、数年以来、結婚式の摩耗で人気のパターンになっても流行で、今日でもあります。カラードレス 格安.のこのスタイルで素敵に見える模様のオフショルダーの袖に行く同じシースのサテンからステッチ/オフショルダーのキャップスリーブの上に薄いと飾ったときに裾フレアのビットとシースのサテンのイブニングドレスとスパゲッティネックラインがすごい見えます。
caipeijie Email
2012-4-17 15:24
请问一下,sphinxse是for mysql的,有没有for pgsql的?
Hogan Email Homepage
2012-5-10 17:55
Mentre youre gestione di problemi complessi tra cui PAYE insieme con le imprese del prelievo, l'idea è sicuramente intelligente per acquisire specializzata fare qualcosa di sicuro si sta usando la vostra organizzazione. Self-employmentSelf lavoratori uomini e donne potrebbe anche fare pieno uso Hogan dei ragionieri in tutta Stansted, quando hanno l'effetto della loro prelievo unico e sì, è spesso sconcertante. Stare di fronte a una buona varietà prelievo può essere schiacciante, di conseguenza, il
hogan280 Email
2012-5-10 18:07
Arrestato per essere un disturbo della quiete pubblica fuori da un negozio asporto, di 15 anni accusato il suo comportamento - si scontra con l'urlare e contro - di abuso sistematico che aveva sofferto per mano di due uomini all'interno. Durante sei ore di testimonianze videoregistrate ha continuato a dire come le era Hogan  stato attirato in da uomini con regali - bevande e una scheda telefonica o forse qualcosa da mangiare - e fatti sentire "pretty" prima di fine viene chiesto di pagare "per "la vodka con il sesso. Ha anche consegnato la biancheria intima macchiata con il DNA del 59-year-old dell'imputato.
数据中心天空 Email Homepage
2012-5-24 22:27
真的分析的很透彻,学习一下。
Coach Outlet Store online Email Homepage
2012-6-6 10:39
If women is the stylish carrier, then bag is  the symbol of fashion. And Coach Outlet Store Online bag must be the representative of fashion. If you want to own one stylish enough coach bag, you should have a look at Coach Outlet Store. All the bags in coach outlet online are the real ones with top quality. The most important is that most of those bags are nearly 80% off. It is a good opportunity for coach bags lovers. Come on.
pklin
2012-6-6 10:47
基于一元分词的汉字搜索中,如何能做到让拥有精确匹配词的条目处于找到的搜索记录的最前面呢,就是比如搜索“国产网络游戏”,如果让有完整的“国产网络游戏”的条目在搜索的最前面显示出来呢
bj198993 Email
2012-8-24 19:13
膜拜大神
土元养殖 Email Homepage
2012-11-9 11:12
看不懂代码的偷偷路过啊
111 Email Homepage
2013-8-12 11:59
sphinx 的分布式好像效率也不怎么高啊
磨延城 Email Homepage
2013-10-21 20:47
磨途歌学习了
分页: 4/5 第一页 上页 1 2 3 4 5 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]