<![CDATA[张宴的博客]]> http://www.lukangtou.cn/index.php zh-cn http://www.lukangtou.cn/sphinx_search/ <![CDATA[ZSphinx构徏准实时更新的分布式通用搜烦引擎q_[原创]]]> 张宴 <net@s135.com> Fri, 05 Feb 2010 00:50:25 +0000 http://www.lukangtou.cn/sphinx_search/ http://blog.www.lukangtou.cn/sphinx_search/]

  前言Q?br/>
  2008q?月,我写q一文章?a href="http://blog.www.lukangtou.cn/post/360/" target="_blank">ZSphinx+MySQL的千万数据全文索(搜烦引擎Q架构设?/a>》。有不少|友希望阅读全文Q我该文整理了一下,分n出来。文解压后大小?.33MQ共19c?br/>
  本站下蝲地址Q?/strong> http://blog.www.lukangtou.cn/book/sphinx/sphinx_mysql.zip

  新浪下蝲分流Q?/strong> http://ishare.iask.sina.com.cn/f/6728201.html

  上述文架构存在的局限,我在2008q?2月的文章?a href="http://blog.www.lukangtou.cn/post/385/" target="_blank">亿数据的高q发通用搜烦引擎架构设计》中已经指出Q一是MySQL本n的ƈ发能力有限,?00?00个ƈ发连接下Q查询和更新比较慢了;二是׃MySQL表的主键与Sphinx索引的ID一一对应Q从而无法跨多表建立整站查询Q而且新增加类别还得修攚w|文Ӟ比较ȝQ三是因为和MySQL集成Q无法发挥出Sphinx的优ѝ虽然如此,但对于一些写入量不大的搜索应用,已经_了,或许对很多h会有帮助?br/>


  正文Q?br/>
  在这之后Q本人基于?a href="http://blog.www.lukangtou.cn/post/385/" target="_blank">亿数据的高q发通用搜烦引擎架构设计》开发的Sphinx分布式通用站内搜烦引擎q_Q已l在生环境q行9个月以上Q经q运营中的不断完善与改进Q目前已形成了一套可扩展的分布式通用站内搜烦引擎框架。CMS、视频、论坛等产品发生的增、删、改操作Q文本内容实时写入自行开发的 HTTPSQS 高性能单消息队列服务,通过队列控制器更新烦引和存储。提供支持XML、JSON的API查询接口Q支持亿U数据的索引、分布式、中文分词、高亮显C、自动摘要、准实时Q?分钟内)增量索引更新?br/>
  点击在新H口中浏览此囄

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

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

  ①、一元分词位于烦引更新模块。Sphinx索引引擎对于CJKQ中日韩Q语aQ必LUTF-8~码Q支持一元切分,假设【反恐行动是国主视角射ȝl游戏】这D|字,Sphinx会将其切成【反 ???????????|?l??戏】,然后Ҏ个字建立反向索引。如果用q句话中包含的字l成一个不存在的词语,例如【恐动】,也会被搜索到Q所以搜索时Q需要加引号Q例如搜索?反恐行动"】,p完全匚wq在一L四个字,不连l的?恐动"】就不会被搜索到。但是,q样q有一个问题,搜烦?反恐行动游戏"】或?国|络游戏"】就会搜索不到。对于这个问题,采用位于搜烦查询模块的中文分词来处理?br/>
  sphinx.conf配置文g中关于UTF-8中文一元分词的配置如下Q?br/>
...省略...
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
}
...省略...


  ②、中文分词位于搜索查询模块。搜索“反恐行动游戏”、“国产网l游戏”,先调用独立的中文分词pȝQ分别切分ؓ“反恐行?游戏”、“国?|络游戏”,q时候,再给以空格分隔的词语加上引号Q去Sphinx搜烦?反恐行动" "游戏"】或?国" "|络游戏"】,p搜烦到这条记录了。中文分词词库发生增、删、改Q无需重徏整个Sphinx搜烦索引?br/>


  2、用自行开发的HTTPSQSQ?a target="_blank">http://code.google.com/p/httpsqsQ开源简单队列服务程序,来缓冲高q发数据写入

  新闻、论坛帖子、客服公告、SNSC֌{发生的增、删、改操作Q文本内定w过更新接口实时写入HTTPSQS队列Q再通过队列控制器更新到Sphinx搜烦引擎索引中?br/>


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

  如果不想使用权重Q只希望严格按照旉、主键等排序Q而匹配模式(Matching modesQ又为非SPH_MATCH_BOOLEANӞ比较常用的是SPH_MATCH_ALL、SPH_MATCH_EXTENDEDQ,Sphinx搜烦l果在某一中的排序会不太准确。例如:按照UNIX旉戛_序排序Q?,20为第一,20,40为第二页Q第一늚最时间戳一定会大于W二늚最大时间戳Q但是,W一中?,20条记录却不会严格按照旉x序,W二亦是如此。因此,如果需要精排序,用户d搜烦l果的某一,需要对Sphinx在某一搜烦l果中的记录另行再排序Q在我的q套搜烦架构中,q一再排序操作由search.php查询接口使用array_multisort()函数处理。一般情况下Q一只会显C??0条记录,因此Q只对几十条记录采用PHP再排序,速度也是非常快的?br/>


  4、队列控制器中“时间控制”与“数量控制”相l合Q实现搜索烦引的1分钟内准实时更新Q?/strong>

  ①、Sphinx 0.9.9生环境的徏索引速度大约?.5 Mbytes/U?400文/U。队列控制器可以讄10U钟更新一ơ增量烦引,只要Sphinx增量索引数据源的文数在38万以内,p保证增量索引??0U内得到更新Q这是从“时间”上q行控制?br/>
  ②、ؓ了避免增量烦引数据源的文数增长?8万,队列控制器在增量索引数据源的文数超q?万时Q还激zd量烦引合q入ȝ引的操作Q合q完成的文从增量索引数据源中删除Q这是从“数量”上q行控制?br/>
............

Tags - , , ]]>
http://www.lukangtou.cn/httpcws_v100/ <![CDATA[ZHTTP协议的开源中文分词系l:HTTPCWS 1.0.0 发布[原创]]]> 张宴 <net@s135.com> Tue, 11 Aug 2009 00:45:05 +0000 http://www.lukangtou.cn/httpcws_v100/ 发布版本Q?/strong>
  httpcws 1.0.0 Q最新版本:2009-08-10发布Q?br/>
  E序|址Q?a target="_blank">http://code.google.com/p/httpcws

  安装使用手册Q?a href="http://blog.www.lukangtou.cn/httpcws_v100/" target="_blank">http://blog.www.lukangtou.cn/httpcws_v100/

  下蝲地址Q?2位版Q:http://httpcws.googlecode.com/files/httpcws-1.0.0-i386-bin.tar.gz

  下蝲地址Q?4位版Q:http://httpcws.googlecode.com/files/httpcws-1.0.0-x86_64-bin.tar.gz

  中文分词在线演示Q?a href="http://blog.www.lukangtou.cn/demo/httpcws/" target="_blank">http://blog.www.lukangtou.cn/demo/httpcws/

  PHP演示E序下蝲Q?a href="http://blog.www.lukangtou.cn/demo/httpcws/httpcws-php-demo.zip" target="_blank">http://blog.www.lukangtou.cn/demo/httpcws/httpcws-php-demo.zip



  httpcws 中文?/strong>
  1、什么是 httpcws Q?/strong>
  HTTPCWS 是一Ƒ֟于HTTP协议的开源中文分词系l,目前仅支持Linuxpȝ。HTTPCWS 使用“ICTCLAS 3.0 2009׃n版中文分词算法”的APIq行分词处理Q得出分词结果。HTTPCWS 取代本Z前开发的 PHPCWS 中文分词扩展?br/>
  ICTCLASQInstitute of Computing Technology, Chinese Lexical Analysis SystemQ是中国U学院计技术研I所在多q研I工作积累的基础上,Z多层隐马模型研制出的汉语词法分析pȝQ主要功能包括中文分词;词性标注;命名实体识别Q新词识别;同时支持用户词典。ICTCLASl过五年_ֿ打造,内核升6ơ,目前已经升CICTCLAS3.0Q分词精?8.45%Q各U词典数据压~后不到3M。ICTCLAS在国?73专家l组l的评测中活动获得了W一名,在第一届国际中文处理研I机构SigHanl织的评中都获得了多项W一名,是当前世界上最好的汉语词法分析器?br/>
  ICTCLAS 3.0 商业版是收费的,而免Ҏ供的 ICTCLAS 3.0 ׃n版不开源,词库是根据h民日报一个月的语料得出的Q很多词语不存在。所以本充的一?9万条词语的自定义词库Q对ICTCLAS分词l果q行合ƈ处理Q输出最l分词结果?br/>
  ׃ ICTCLAS 3.0 2009 ׃n版只支持GBK~码Q因此,如果是UTF-8~码的字W串Q可以先用iconv函数转换成GBK~码Q再用httpcwsq行分词处理Q最后{换回UTF-8~码?br/>
  HTTPCWS 软g自nQ包括httpcws.cpp源文件、dict/httpcws_dict.txt自定义词库)采用NewBSD开源协议,可以自由修改。HTTPCWS 使用?ICTCLAS ׃n?API ?dict/Data/ 目录内的语料库,版权及著作权归中国科学院计算技术研I所、ictclas.org所有,使用需遵@其相兛_议?br/>


  2、httpcws 中文分词在线演示
  演示|址Q?/span>http://blog.www.lukangtou.cn/demo/httpcws/



  3、httpcws 中文分词下蝲安装
  32位版Q?br/>
cd /usr/local/
wget http://httpcws.googlecode.com/files/httpcws-1.0.0-i386-bin.tar.gz
tar zxvf httpcws-1.0.0-i386-bin.tar.gz
rm -f httpcws-1.0.0-i386-bin.tar.gz
cd httpcws-1.0.0-i386-bin/
ulimit -SHn 65535
/usr/local/httpcws-1.0.0-i386-bin/httpcws -d -x /usr/local/httpcws-1.0.0-i386-bin/dict/


  64位版Q?br/>
cd /usr/local/
wget http://httpcws.googlecode.com/files/httpcws-1.0.0-x86_64-bin.tar.gz
tar zxvf httpcws-1.0.0-x86_64-bin.tar.gz
rm -f httpcws-1.0.0-x86_64-bin.tar.gz
cd httpcws-1.0.0-x86_64-bin/
ulimit -SHn 65535
/usr/local/httpcws-1.0.0-x86_64-bin/httpcws -d -x /usr/local/httpcws-1.0.0-x86_64-bin/dict/


  命o行启动参敎ͼ

  点击在新H口中浏览此囄



  4、httpcws 使用Ҏ
  GETҎQ文本长度受URL的长度限Ӟ需要分词的文本为GBK~码Q最好采用urlencodeҎ本进行编码)Q?br/>

  POSTҎQ文本长度无限制Q适用于大文本分词Q需要分词的文本为GBK~码Q最好采用urlencodeҎ本进行编码)Q?br/>
curl -d "有h的地方就有江? http://192.168.8.42:1985
curl -d "%D3%D0%C8%CB%B5%C4%B5%D8%B7%BD%BE%CD%D3%D0%BD%AD%BA%FE" http://192.168.8.42:1985


  PHP 调用 HTTPCWS CZQ?/strong>

  ①、对GBK~码的字W串q行中文分词处理QHTTP POST方式Q:
<?php
@header('Content-Type: text/html; charset=gb2312');
$text = "有h的地方就有江?;
$text = urlencode($text);
$opts = array(
  'http'=>array(
    'method'=>"POST",
    'header'=>"Content-type: application/x-www-form-urlencoded\r\n".
              "Content-length:".strlen($data)."\r\n" .
              "Cookie: foo=bar\r\n" .
              "\r\n",
    'content' => $text,
  )
);
$context = stream_context_create($opts);
$result = file_get_contents("http://127.0.0.1:1985", false, $context);
echo $result;
?>


............

Tags - , , , , , , ]]>
http://www.lukangtou.cn/phpcws_v100/ <![CDATA[我的开源PHP中文分词扩展QPHPCWS 1.0.0[原创]]]> 张宴 <net@s135.com> Mon, 16 Feb 2009 15:40:38 +0000 http://www.lukangtou.cn/phpcws_v100/ http://blog.www.lukangtou.cn/phpcws_v100/]

  注:最新的分词pȝ HTTPCWS 已经发布Q用来取?PHPCWS?br/>
  LM下网址下蝲 HTTPCWSQ?/span>

  http://code.google.com/p/httpcws

  原来?PHPCWS 停止更新?br/>



  名称QPHPCWSQPHP中文分词扩展Q?br/>  协议QNew BSD License
  作者:张宴
  |址Q?a target="_blank">http://code.google.com/p/phpcws/
  SVNQ?a target="_blank">http://code.google.com/p/phpcws/source/browse/#svn/trunk/phpcws

  一、PHPCWS ?/strong>

  1、什么是 PHPCWS Q?/strong>
  PHPCWS 是一Ƒּ源的PHP中文分词扩展Q目前仅支持Linux/Unixpȝ?br/>
  PHPCWS 先用“ICTCLAS 3.0 ׃n版中文分词算法”的APIq行初次分词处理Q再使用自行~写的“逆向最大匹配算法”对分词和进行词语合q处理,q增加标点符可滤功能,得出分词l果?br/>
  ICTCLASQInstitute of Computing Technology, Chinese Lexical Analysis SystemQ是中国U学院计技术研I所在多q研I工作积累的基础上,Z多层隐马模型研制出的汉语词法分析pȝQ主要功能包括中文分词;词性标注;命名实体识别Q新词识别;同时支持用户词典。ICTCLASl过五年_ֿ打造,内核升6ơ,目前已经升CICTCLAS3.0Q分词精?8.45%Q各U词典数据压~后不到3M。ICTCLAS在国?73专家l组l的评测中活动获得了W一名,在第一届国际中文处理研I机构SigHanl织的评中都获得了多项W一名,是当前世界上最好的汉语词法分析器?br/>
  ICTCLAS 3.0 商业版是收费的,而免Ҏ供的 ICTCLAS 3.0 ׃n版不开源,词库是根据h民日报一个月的语料得出的Q很多词语不存在。所以本人对ICTCLAS分词后的l果Q再采用逆向最大匹配算法,Ҏ自己补充的一?万条词语的自定义词库Q与ICTCLAS词库中的词语不重复)Q对ICTCLAS分词l果q行合ƈ处理Q输出最l分词结果?br/>
  ׃ ICTCLAS 3.0 ׃n版只支持GBK~码Q因此,如果是UTF-8~码的字W串Q可以先用PHP的iconv函数转换成GBK~码Q再用phpcws_split函数q行分词处理Q最后{换回UTF-8~码?br/>
  2、PHPCWS 中文分词在线演示

  演示|址Q?/span>http://blog.www.lukangtou.cn/demo/phpcws/

  3、PHPCWS 分词速度及用?/strong>

  初次使用ӞApache ?php-cgi(FastCGI) q程Q需要加载一ơ词库到内存中,需?.0XU?8字节的一句话——?009q??3日,我编写了一ƾPHP中文分词扩展QPHPCWS 1.0.0。”,分词速度只需0.0003U?br/>
  PHPCWS 属于?a href="post/385.htm" target="_blank">亿数据的高q发通用搜烦引擎架构设计》的一部分Q用作“搜索查询接口”的关键字分词处理。在此架构中QSphinx索引引擎对于CJKQ中日韩Q语a支持一元切分,假设【反恐行动是国主视角射ȝl游戏】这D|字,Sphinx会将其切成【反 ???????????|?l??戏】,然后Ҏ个字建立反向索引。如果用q句话中包含的字l成一个不存在的词语,例如【恐动】,也会被搜索到Q所以搜索时Q需要加引号Q例如搜索?反恐行动"】,p完全匚wq在一L四个字,不连l的?恐动"】就不会被搜索到。但是,q样q有一个问题,搜烦?反恐行动游戏"】或?国|络游戏"】就会搜索不到。所以,我在搜烦层写了个PHP中文分词扩展Q搜索“反恐行动游戏”、“国产网l游戏”,会被PHPCWS中文分词函数分别切分为“反恐行?游戏”、“国?|络游戏”,q时候,用PHP函数l以I格分隔的词语加上引PL索?反恐行动" "游戏"】或?国" "|络游戏"】,p搜烦到这条记录了。由于PHPCWS位于搜烦层,中文分词词库发生增、删、改Q只需qx重启一ơWeb服务器或php-cgiq程卛_Q无需重徏搜烦索引?br/>
  Ҏ上述情况Q对于那些采用二元交叉切分的搜烦引擎QPHPCWS用在前端搜烦层对用户输入的搜索关键字、短语进行分词处理,同样适合。PHPCWS开发的目的正在于此Q对于短句、小文本中文分词切分Q速度非常之快?br/>
  4、自定义词库

  自定义词库名UCؓuserdict.tchQ格式ؓ Tokyo Cabinet DBM ?Abstract key-value 内存哈希数据库(key为GBK~码的词语名词,value频。目前词频均?Q暂时用不上Q。自定义词库的修改在安装步骤中会详细介绍?br/>


  二、phpcws 1.0.1 安装步骤

............

Tags - , , , , ]]>
http://www.lukangtou.cn/post/385/ <![CDATA[亿数据的高q发通用搜烦引擎架构设计[原创]]]> 张宴 <net@s135.com> Tue, 09 Dec 2008 00:47:37 +0000 http://www.lukangtou.cn/post/385/ http://blog.www.lukangtou.cn/post/385/]

  曄在七月,写过一文章──?a href="post/360.htm" target="_blank">ZSphinx+MySQL的千万数据全文索(搜烦引擎Q架构设?/a>》,前公司的分类信息搜烦Z此架构,效果明显Q甚臛_很大一部分带Where条g的MySQL SQL查询Q都改用了Sphinx+MySQL搜烦。但是,q套架构仍存在局限:一是MySQL本n的ƈ发能力有限,?00?00个ƈ发连接下Q查询和更新比较慢了;二是׃MySQL表的主键与Sphinx索引的ID一一对应Q从而无法跨多表建立整站查询Q而且新增加类别还得修攚w|文Ӟ比较ȝQ三是因为和MySQL集成Q无法发挥出Sphinx的优ѝ?br/>
  最q,我设计出了下列这套最新的搜烦引擎架构Q目前已l写出“搜索查询接口”和“烦引更新接口”的beta版。经试Q在一台“奔腑֛ 3.6GHz 双核CPU?GB内存”的普通PC机,7000万条索引记录的条件下Q“搜索查询接口”^均查询速度?.0XXU(查询速度已经辑ֈ癑ֺ、谷歌、搜狗、中国雅虎等搜烦引擎的水qI详见文章末尾的“附2”)Qƈ且能够支撑高?000的ƈ发连接;而“烦引更新接口”进行数据分析、入队列、返回信息给用户的全q程Q高?500 Requests/Sec?br/>
  “队列控制器”这一部分是核心,它要控制队列dQ更新MySQL主表与增量表Q更新搜索引擎数据存储层Tokyo TyrantQ准实时Q?分钟内)完成更新Sphinx增量索引Q定期合qSphinx索引。我预计在这周写出beta版?br/>
点击在新H口中浏览此囄

  囄说明Q?/strong>
  1、搜索查询接口:

............

Tags - , , , , , , , , , , , , , ]]>
http://www.lukangtou.cn/post/360/ <![CDATA[ZSphinx+MySQL的千万数据全文索(搜烦引擎Q架构设计[原创]]]> 张宴 <net@s135.com> Sun, 27 Jul 2008 14:29:17 +0000 http://www.lukangtou.cn/post/360/ http://blog.www.lukangtou.cn/post/360/]

  前言Q本文阐q的是一Ƅq生产环境检验的千万U数据全文检索(搜烦引擎Q架构。本文只列出前几章的内容节选,不提供全文内宏V?br/>
  在DELL PowerEdge 6850服务器(四颗64 位Inter Xeon MP 7110N处理?/ 8GB内存Q、RedHat AS4 Linux操作pȝ、MySQL 5.1.26、MyISAM存储引擎、key_buffer=1024M环境下实,单表1000万条记录的数据量Q这张MySQL表拥有int、datetime、varchar、text{类型的10多个字段Q只有主键,无其它烦引)Q用主键QPRIMARY KEYQ作为WHERE条gq行SQL查询Q速度非常之快Q只耗费0.01U?br/>
  俄罗斯的开源全文搜索引擎Y?a target="_blank">SphinxQ单一索引最大可包含1亿条记录Q在1千万条记录情况下的查询速度?.xU(毫秒U)。Sphinx创徏索引的速度为:创徏100万条记录的烦引只需3?分钟Q创?000万条记录的烦引可以在50分钟内完成,而只包含最?0万条记录的增量烦引,重徏一ơ只需几十U?br/>
  Z以上几点Q我设计Zq套搜烦引擎架构。在生环境q行了一周,效果非常不错。有旉我会专ؓ配合Sphinx搜烦引擎Q开发一个逻辑单、速度快、占用内存低、非表锁的MySQL存储引擎插gQ用来代替MyISAM引擎Q以解决MyISAM存储引擎在频J更新操作时的锁表gq问题。另外,分布式搜索技术上已无M问题?br/>


  一、搜索引擎架构设计:
  1、搜索引擎架构图Q?/strong>
  点击在新H口中浏览此囄

  2、搜索引擎架构设计思\Q?/strong>
  (1)、调用方式最化:
  量方便前端Web工程师,只需要一条简单的SQL语句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可实现高效搜索?br/>
  (2)、创建烦引、查询速度快:
  ①、Sphinx Search 是由俄罗斯hAndrew Aksyonoff 开发的高性能全文搜烦软g包,在GPL与商业协议双许可协议下发行?br/>  Sphinx的特征:
  •Sphinx支持高速徏立烦引(可达10MB/U,而Lucene建立索引的速度?.8MB/U)
  •高性能搜烦Q在2-4 GB的文本上搜烦Q^?.1U内获得l果Q?br/>  •高扩展性(实测最高可?00GB的文本徏立烦引,单一索引可包?亿条记录Q?br/>  •支持分布式?br/>  •支持基于短语和Zl计的复合结果排序机?br/>  •支持Q意数量的文g字段Q数值属性或全文索属性)
  •支持不同的搜烦模式Q“完全匹配”,“短语匹配”和“Q一匚w”)
  •支持作为Mysql的存储引?br/>
  ②、通过国外《High Performance MySQL》专家组的测试可以看出,Ҏ主键q行查询的类似“SELECT ... FROM ... WHERE id = ...”的SQL语句Q其中id为PRIMARY KEYQ,每秒钟能够处?0000ơ以上的查询Q而普通的SELECT查询每秒只能处理几十ơ到几百ơ:
  点击在新H口中浏览此囄

  ③、Sphinx不负责文本字D늚存储。假讑ְ数据库的id、date、title、body字段Q用sphinx建立搜烦索引。根据关键字、时间、类别、范围等信息查询一下sphinxQsphinx只会查询结果的IDL非文本信息告诉我们。要昄title、body{信息,q需要根据此ID号去查询MySQL数据库,或者从Memcachedb{其他的存储中取得。安装SphinxSE作ؓMySQL的存储引擎,MySQL与Sphinxl合hQ是一U便LҎ?br/>  创徏一张Sphinxcd表,MyISAM表的主键ID和Sphinx表的ID作一个JOIN联合查询。这P对于MyISAM表来所Q只相当于一个WHERE id=...的主键查询,WHERE后的条g都交lSphinxd理,可以充分发挥两者的优势Q实现高速搜索查询?br/>
  (3)、按服务cdq行分离Q?/strong>
  Z保证数据的一致性,我在配置Sphinxd索引源的MySQL数据库时Q进行了锁表。Sphinxd索引源的q程会耗费一定时_׃MyISAM存储引擎的读锁和写锁是互斥的Qؓ了避免写操作被长旉dQ导致数据库同步落后跟不上,我将提供“搜索查询服务”的和提供“烦引源服务”的MySQL数据库进行了分开。监?306端口的MySQL提供“搜索查询服务”,监听3406端口的MySQL提供“烦引源服务”?br/>
  (4)、“主索引Q增量烦引”更新方式:
  一般网站的特征Q信息发布较为频J;刚发布完的信息被~辑、修改的可能性大Q两天以前的老帖变动性较?br/>  Zq个特征Q我设计了Sphinxȝ引和增量索引。对于前?7:00之前的记录徏立主索引Q每天凌晨自动重Zơ主索引Q对于前?7:00之后到当前最新的记录Q间?分钟自动重徏一ơ增量烦引?br/>
  (5)、“Ext3文gpȝQtmpfs内存文gpȝ”相l合Q?/strong>
  Z避免?分钟重徏增量索引D盘IO较重Q从而引Ll负载上升,我将ȝ引文件创建在盘Q增量烦引文件创建在tmpfs内存文gpȝ?dev/shm/”内。?dev/shm/”内的文件全部驻留在内存中,d速度非常快。但是,重启服务器会D?dev/shm/”内的文件丢失,针对q个问题Q我会在服务器开机时自动创徏?dev/shm/”内目录l构和Sphinx增量索引?br/>
  (6)、中文分词词库:
  我根据“自整理的中文分词库”+“搜狗拼韌入法l胞词库”+“LibMMSeg高频字库”+... l合整理成一份中文分词词库,Z某些考虑暂不提供。你可以使用LibMMSeg自带的中文分词词库?br/>
............

Tags - , , , , , , , , , , , ]]>
http://www.lukangtou.cn/post/356/ <![CDATA[MySQL中文全文索引插g mysqlcft 1.0.0 安装使用文[原创]]]> 张宴 <net@s135.com> Tue, 01 Jul 2008 14:57:58 +0000 http://www.lukangtou.cn/post/356/ http://blog.www.lukangtou.cn/post/356/]

  MySQL在高q发q接、数据库记录数较多的情况下,SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不仅效率差Q而且以通配W?和_开头作查询Ӟ使用不到索引Q需要全表扫描,Ҏ据库的压力也很大。MySQL针对q一问题提供了一U全文烦引解x案,q不仅仅提高了性能和效率(因ؓMySQL对这些字D做了烦引来优化搜烦Q,而且实现了更高质量的搜烦。但是,至今为止QMySQL对中文全文烦引无法正支持?br/>
  中文与西Ҏ字如英文的一个重要区别在于,西方文字以单词ؓ单位Q单词与单词之间以空格分隔。而中文以字ؓ单位Q词׃个或多个字组成,词与词之间没有空格分隔。当试图在一个含有中文字W的字段中用全文搜索时Q不会得到正的l果Q原因在于中文中没有像英文空格那样对词定界,不能以空g为分Ԍ对中文词语进行烦引?br/>
  引用?a target="_blank">MySQL 5.1参考手?/a>》中的一D话Q?br/>
引用
12.7. 全文搜烦功能Q?a target="_blank">http://dev.mysql.com/doc/refman/5.1/zh/functions.htmlQ?br/>?MySQL支持全文索引和搜索功能。MySQL中的全文索引cdFULLTEXT的烦引。FULLTEXT 索引仅可用于 MyISAM 表;他们可以从CHAR?VARCHAR或TEXT列中作ؓCREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE ?CREATE INDEX被添加。对于较大的数据集,你的资料输入一个没有FULLTEXT索引的表中,然后创徏索引Q?光度比把资料输入现有FULLTEXT索引的速度更ؓ快?br/>
?FULLTEXT分析E序会通过L某些分隔W来定单词的v始位|和l束位置Q例? ' (间隔W号)?, (逗号)以及 . (句号 )。假如单词没有被分隔W分开Q?例如在中文里 ), ?FULLTEXT 分析E序不能定一个词的v始位|和l束位置。ؓ了能够在q样的语a中向FULLTEXT 索引d单词或其它编入烦引的术语Q你必须对它们进行预处理Q其被一些诸?之类的Q意分隔符分隔开?br/>
?诸如汉语和日语这L表意语言没有自定界符。因此, FULLTEXT分析E序不能定在这些或其它的这c语a中词的v始和l束的位|?/div>


  国内已有的MySQL中文全文索引解决Ҏ有两个:一是v量科技?a target="_blank">MySQL5.0.37--LinuxX86-Chinese+Q二是hightman开发的mysql-5.1.11-ft-hightmanQ两者都是基于中文分词技术,对中文语句进行拆分。但是,两者都有弊端,一是不支持64位操作系l;二是对修改了MySQL源码Q只支持某一MySQL版本Q不便于跟进新版本;三是词库不能做到很大很全Q对于专业性质较强的数据库内容Q例如搜索“颐和园路东口”、“清华东路西口”等公交站点Q“莱镇香格里”、“碧云天”等楼盘名称Q,Z中文分词的全文烦引经常搜索不出来M内容Q即使添加分词词库,也不会很全面?br/>
  ׃_և全文查询的需要,我借鉴了二元交叉切分算法的思想Q用自创的“三字节交叉切分法”,写出了这䏀MySQL中文全文索引插g──mysqlcft 1.0.0”。由于开发时间仓促,隑օ存在未发现的问题Q这后l的版本中不断完善。对于百万条记录的MySQL表进行全文检索,mysqlcft已经够用?br/>


  Mysqlcft |址Q?a target="_blank">http://code.google.com/p/mysqlcft/

  Mysqlcft 作者:张宴



  一、MySQL中文全文索引插gmysqlcft的特点:
  1、优点:
  ①、精准度很高Q采用自创的“三字节交叉切分法”,对中文语句进行分Ԍ无中文分词词库,搜烦_և度远比中文分词算法高Q能辑ֈLIKE '%...%"的准率?br/>  ②、查询速度快:查询速度比LIKE '%...%"搜烦??0倍,文章末尾有测试结果;
  ③、标准插件式Q以MySQL 5.1全文索引的标准插件Ş式开发,不修改MySQL源代码,不媄响MySQL的其他功能,可快速跟qMySQL新版本;
  ④、支持版本多Q支持所有的MySQL 5.1 Release Candidate版本Q即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RCQ?br/>  ⑤、支持字W集Q支持包括GBK、GB2312、UTF-8、Latin1、BIG5在内的MySQL字符集(其他字符集没有测试过Q;
  ⑥、系l兼容好Q具有i386和x86_64两个版本Q支?2位(i386Q和64位(x86_64QCPU及LinuxpȝQ?br/>  ⑦、适合分布式:非常适合MySQL Slave分布式系l架构,无词库维护成本,不存在词库同步问题?br/>
  2、缺点:
  ①、mysqlcft中文全文索引只适用于MyISAM表,因ؓMySQL只支持对MyISAM表徏立FULLTEXT索引Q?br/>  ②、MySQL不能静态编译安装,否则无法安装mysqlcft插gQ?br/>  ③、基于“三字节交叉切分法”的索引文g会比量、ft-hightman{基于“中文分词算法”的索引文gE大Q但不是大很多。根据我的测试,mysqlcft全文索引?MYI索引文g?MYD数据文g??倍?br/>


  二、mysqlcft的核心思想──“三字节交叉切分法?/strong>

  点击在新H口中浏览此囄

  注:本文??数字序号代表“英文”、“数字”和“半个汉字”,以便说明?br/>  1、按三字节对中文语句q行切分Q徏立全文烦引:
  例如Q“全文烦引”或?台x光机”四个字会被交叉分拆?份,建立反向索引Q?br/>  012  123  234  345  456  567

  2、按三字节对搜烦的关键字q行切分Q在全文索引中找出对应信息:
  例①Q搜索关键字“文索”,用数字序可C就是??”,那么它将被切分成Q?br/>  234  345
  q样Q就与全文烦引对上了?br/>
  例②Q搜索关键字“x光机”,用数字序可C就是??”,那么它将被切分成Q?br/>  345  456  567
  q样Q也与全文烦引对上了?br/>
  例③Q搜索关键字??光机”,用数字序可C就是??”和??”,那么它将被切分成Q?br/>  012  456  567
  q样Q多关键字搜索也与全文烦引对上了?br/>
............
]]> ߾ƷƵ