<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[张宴的博客]]></title> 
<link>http://zyan.cc/index.php</link> 
<description><![CDATA[Web系统架构与底层研发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[张宴的博客]]></copyright>
<item>
<link>http://zyan.cc/post/356/</link>
<title><![CDATA[MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[搜索引擎技术]]></category>
<pubDate>Tue, 01 Jul 2008 14:57:58 +0000</pubDate> 
<guid>http://zyan.cc/post/356/</guid> 
<description>
<![CDATA[ 
	　　[文章+程序 作者：张宴 本文版本：v1.0 最后修改：2008.07.01 转载请注明原文链接：<a href="http://blog.zyan.cc/post/356/" target="_blank">http://blog.zyan.cc/post/356/</a>]<br/><br/>　　MySQL在高并发连接、数据库记录数较多的情况下，SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不仅效率差，而且以通配符%和_开头作查询时，使用不到索引，需要全表扫描，对数据库的压力也很大。MySQL针对这一问题提供了一种全文索引解决方案，这不仅仅提高了性能和效率（因为MySQL对这些字段做了索引来优化搜索），而且实现了更高质量的搜索。但是，至今为止，MySQL对中文全文索引无法正确支持。<br/><br/>　　中文与西方文字如英文的一个重要区别在于，西方文字以单词为单位，单词与单词之间以空格分隔。而中文以字为单位，词由一个或多个字组成，词与词之间没有空格分隔。当试图在一个含有中文字符的字段中使用全文搜索时，不会得到正确的结果，原因在于中文中没有像英文空格那样对词定界，不能以空格作为分割，对中文词语进行索引。<br/><br/>　　引用《<a href="http://dev.mysql.com/doc/refman/5.1/zh/index.html" target="_blank">MySQL 5.1参考手册</a>》中的一段话：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">12.7. 全文搜索功能（<a href="http://dev.mysql.com/doc/refman/5.1/zh/functions.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/zh/functions.html</a>）<br/>● MySQL支持全文索引和搜索功能。MySQL中的全文索引类型FULLTEXT的索引。FULLTEXT 索引仅可用于 MyISAM 表；他们可以从CHAR、 VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建，或是随后使用ALTER TABLE 或 CREATE INDEX被添加。对于较大的数据集，将你的资料输入一个没有FULLTEXT索引的表中，然后创建索引， 其速度比把资料输入现有FULLTEXT索引的速度更为快。<br/><br/>● FULLTEXT分析程序会通过寻找某些分隔符来确定单词的起始位置和结束位置，例如' ' (间隔符号)、 , (逗号)以及 . (句号 )。假如单词没有被分隔符分开，(例如在中文里 ), 则 FULLTEXT 分析程序不能确定一个词的起始位置和结束位置。为了能够在这样的语言中向FULLTEXT 索引添加单词或其它编入索引的术语，你必须对它们进行预处理，使其被一些诸如"之类的任意分隔符分隔开。<br/><br/>● 诸如汉语和日语这样的表意语言没有自定界符。因此， FULLTEXT分析程序不能确定在这些或其它的这类语言中词的起始和结束的位置。</div></div><br/><br/>　　国内已有的MySQL中文全文索引解决方案有两个：一是海量科技的<a href="http://www.hylanda.com/server/" target="_blank">MySQL5.0.37--LinuxX86-Chinese+</a>，二是hightman开发的<a href="http://www.hightman.cn/bbs/viewthread.php?tid=18&extra=page%3D1" target="_blank">mysql-5.1.11-ft-hightman</a>，两者都是基于中文分词技术，对中文语句进行拆分。但是，两者都有弊端，一是不支持64位操作系统；二是对修改了MySQL源码，只支持某一MySQL版本，不便于跟进新版本；三是词库不能做到很大很全，对于专业性质较强的数据库内容（例如搜索“颐和园路东口”、“清华东路西口”等公交站点，“莱镇香格里”、“碧海云天”等楼盘名称），基于中文分词的全文索引经常搜索不出来任何内容，即使添加分词词库，也不会很全面。<br/><br/>　　由于精准全文查询的需要，我借鉴了二元交叉切分算法的思想，用自创的“三字节交叉切分算法”，写出了这款“MySQL中文全文索引插件──mysqlcft 1.0.0”。由于开发时间仓促，难免存在未发现的问题，这将后续的版本中不断完善。对于百万条记录的MySQL表进行全文检索，mysqlcft已经够用。<br/><br/><hr/><br/>　　<strong>Mysqlcft 网址：<a href="http://code.google.com/p/mysqlcft/" target="_blank">http://code.google.com/p/mysqlcft/</a></strong><br/><br/>　　<strong>Mysqlcft 作者：张宴</strong><br/><br/><hr/><br/>　　<strong>一、MySQL中文全文索引插件mysqlcft的特点：</strong><br/>　　1、优点：<br/>　　①、精准度很高：采用自创的“三字节交叉切分算法”，对中文语句进行分割，无中文分词词库，搜索精准度远比中文分词算法高，能达到LIKE '%...%"的准确率。<br/>　　②、查询速度快：查询速度比LIKE '%...%"搜索快3～50倍，文章末尾有测试结果；<br/>　　③、标准插件式：以MySQL 5.1全文索引的标准插件形式开发，不修改MySQL源代码，不影响MySQL的其他功能，可快速跟进MySQL新版本；<br/>　　④、支持版本多：支持所有的MySQL 5.1 Release Candidate版本，即MySQL 5.1.22 RC～最新的MySQL 5.1.25 RC；<br/>　　⑤、支持字符集：支持包括GBK、GB2312、UTF-8、Latin1、BIG5在内的MySQL字符集（其他字符集没有测试过）；<br/>　　⑥、系统兼容好：具有i386和x86_64两个版本，支持32位（i386）和64位（x86_64）CPU及Linux系统；<br/>　　⑦、适合分布式：非常适合MySQL Slave分布式系统架构，无词库维护成本，不存在词库同步问题。<br/><br/>　　2、缺点：<br/>　　①、mysqlcft中文全文索引只适用于MyISAM表，因为MySQL只支持对MyISAM表建立FULLTEXT索引；<br/>　　②、MySQL不能静态编译安装，否则无法安装mysqlcft插件；<br/>　　③、基于“三字节交叉切分算法”的索引文件会比海量、ft-hightman等基于“中文分词算法”的索引文件稍大，但不是大很多。根据我的测试，mysqlcft全文索引的.MYI索引文件是.MYD数据文件的2～5倍。<br/><br/><hr/><br/>　　<strong>二、mysqlcft的核心思想──“三字节交叉切分算法”</strong><br/><br/>　　<a href="http://zyan.cc/attachment/200807/mysqlcft.gif" target="_blank"><img src="http://zyan.cc/attachment/200807/mysqlcft.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　注：本文以0～7数字序号代表“英文”、“数字”和“半个汉字”，以便说明。<br/>　　1、按三字节对中文语句进行切分，建立全文索引：<br/>　　例如：“全文索引”或“1台x光机”四个字会被交叉分拆为6份，建立反向索引：<br/>　　012　　123　　234　　345　　456　　567<br/><br/>　　2、按三字节对搜索的关键字进行切分，在全文索引中找出对应信息：<br/>　　例①：搜索关键字“文索”，用数字序号表示就是“2～5”，那么它将被切分成：<br/>　　234　　345<br/>　　这样，就与全文索引对上了。<br/><br/>　　例②：搜索关键字“x光机”，用数字序号表示就是“3～7”，那么它将被切分成：<br/>　　345　　456　　567<br/>　　这样，也与全文索引对上了。<br/><br/>　　例③：搜索关键字“1台 光机”，用数字序号表示就是“0～2”和“4～7”，那么它将被切分成：<br/>　　012　　456　　567<br/>　　这样，多关键字搜索也与全文索引对上了。<br/><br/>............<br/>
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1272</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>支持 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Tue, 01 Jul 2008 15:19:15 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1272</guid> 
<description>
<![CDATA[ 
	不看高手的文章 不知自己的浅薄
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1274</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>罐头 &lt;tinnyliu@gmail.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 02 Jul 2008 01:11:57 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1274</guid> 
<description>
<![CDATA[ 
	很强大=)<br/>支持，向你学习。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1276</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>outrace &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 02 Jul 2008 06:35:23 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1276</guid> 
<description>
<![CDATA[ 
	博主<br/>不知道是否比较过<a href="http://www.coreseek.com/" target="_blank">http://www.coreseek.com/</a>（开源的）<br/>这个公司基于Sphinx及libmmsg分词引擎提供的全文检索解决方案。<br/><br/>如果有比较结果，但愿可以共享出来<br/><br/>目前也在考察全文检索的解决方案<br/>还不知道要怎么做。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1278</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>yejr &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 02 Jul 2008 08:26:53 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1278</guid> 
<description>
<![CDATA[ 
	有个bug，utf8表下，如果表内容为空，直接全文检索查询，则会导致服务器iowait很大，直至假死，拒绝服务。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1280</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>yejr &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 02 Jul 2008 08:39:26 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1280</guid> 
<description>
<![CDATA[ 
	刚才的bug没说清楚。具体情况是test表的title和body字段均为空，但id字段有值，set names utf8之后，进行全文索引查询，会导致上述问题。如果set names latin1/gbk则没有问题。博主可以自己测试下。<br/>dell 2950,16G mem,Red Hat Enterprise Linux AS release 4 (Nahant Update 6),mysql 5.1.24rc
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1282</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>lphy &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 02 Jul 2008 14:31:14 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1282</guid> 
<description>
<![CDATA[ 
	每次来看都有新的东西，最近一直在为全文搜索发愁，正在在sphinx和lucene之间摇摆。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1283</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>dancebear &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 03 Jul 2008 01:43:40 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1283</guid> 
<description>
<![CDATA[ 
	sphinx引擎我到是用过在不少地方了，感觉比mysql的插件来说他有几个优势。<br/>首先他的索引是独立的，搜索进程也是独立的，同时由于他是可以做分布式处理的，因此在效率上要比使用mysql要高不少。<br/>其次他不需要建立fulltext索引，因此在mysql数据库的索引上要小很多。<br/>另外他可以使用sphinx来进行更多的操作，比如进行条件过滤等等。可以实现更多功能而无需对数据库进行查找；更加快速。<br/>而coreseek的修改版的sphinx使用了python作为第三种数据源，因此通过python可以实现任意一种数据库甚至是文本的索引。同样也可以实现对GBK，UTF等字符集的索引，另外他的分词库也可以根据自己的需要进行修改和扩展。<br/>博主有空可以研究下。<br/><br/>PS：楼上的你如果要选择的话我建议你选择sphinx而不是lucene，lucene太臃肿了，相对来说sphinx就轻便很多。而且有很多API接口提供比如php，java，python等都有相应的api可以使用。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1285</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>snoopy &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 03 Jul 2008 02:48:29 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1285</guid> 
<description>
<![CDATA[ 
	高手！能否麻烦编译一份for win32的？
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1288</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>chancey &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 03 Jul 2008 04:07:58 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1288</guid> 
<description>
<![CDATA[ 
	最好是提供源码 大家可以共同去完善~
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1294</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>SD &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 03 Jul 2008 15:46:51 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1294</guid> 
<description>
<![CDATA[ 
	super men
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1295</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>wienne &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 03 Jul 2008 23:22:40 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1295</guid> 
<description>
<![CDATA[ 
	有for FreeBSD的吗?<br/><br/>我的系统版本还是 4.x 的
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1296</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>chancey &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 04 Jul 2008 03:12:48 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1296</guid> 
<description>
<![CDATA[ 
	全文索引建立的时间太长 600M的一个表 运行了一天一夜还没有完成 结束进程时索引临时文件达到了3G
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1298</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>outrace &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 05 Jul 2008 01:53:32 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1298</guid> 
<description>
<![CDATA[ 
	to:dancebear<br/>我现在在试用sphinx有一个问题<br/>就是sphinx要求ID的列必须是数字类型，而我们目前的系统<br/>ID都是uuid()所得到字符类型。<br/><br/>该咋办呢？
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1300</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>ctrlx &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 05 Jul 2008 09:43:47 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1300</guid> 
<description>
<![CDATA[ 
	我也关注楼上的问题。。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/356/#blogcomment1301</link>
<title><![CDATA[[评论] MySQL中文全文索引插件 mysqlcft 1.0.0 安装使用文档[原创]]]></title> 
<author>ctrlx &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 05 Jul 2008 09:44:08 +0000</pubDate> 
<guid>http://zyan.cc/post/356/#blogcomment1301</guid> 
<description>
<![CDATA[ 
	我也关注楼上的问题。
]]>
</description>
</item>
</channel>
</rss>