当前位置:首页 > Mysql教程 > 列表

mysql全文搜索与中文全文搜索方法

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-08 13:28:18 浏览: 评论:0 

本文章先是给大家介绍利用mysql自带的全文搜索功能来实现英文与中文全文搜索的对比,然后介绍了由google开发的一款支持中文全文搜索的插件,有需要的朋友可参考.

mysql自带的功能,MySQL全文搜索的语法,代码如下:

  1. SELECT fields list FROM table WHERE MATCH ( 
  2.  
  3. col1 
  4.  
  5.  
  6. col2 
  7.  
  8. ,...) AGAINST ( 
  9.  
  10. expr 
  11.  
  12.  
  13. search_modifier 
  14.  
  15. ]) 
  16.  
  17.  
  18. search_modifier: 
  19.  
  20. IN BOOLEAN MODE | WITH QUERY EXPANSION } 

例如,代码如下:

select * from articles where match(title,body) against(‘北京 奥运’)在字段“title,body”上全文搜索“北京 奥运” 

注意,MySQL的全文搜索索引只能建立在Myisam引擎上,首先用下面表举例,代码如下:

  1. CREATE TABLE articles ( 
  2. id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY
  3. title VARCHAR(200), 
  4. body TEXT, 
  5. FULLTEXT (title,body) 
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

MySQL使用Match()和Against()执行全文搜索,举例如下:

SELECT body FROM articles WHERE Match(body) Against('www.phpfensi.com');

如上Match是正对指定的列进行搜索,Against('www.phpfensi.com')是正对指定词进行搜索.

另外:使用查询扩展WITH QUERY EXPANSION,将会搜索出更多结果(mysql会将匹配的行中有用的词再次进行搜索,这样搜索出来的结果更多,但可能不是你想要的);

使用布尔文本搜索IN BOOLEAN MODE,类似我们平时使用seo/seo.html" target="_blank">搜索引擎时用到的的语法:逻辑与、逻辑或、逻辑非等.支持的布尔操作符如下:

  1. 全文布尔操作符: 
  2. -------------------------------------------------------------------------------------------------------------- 
  3. |操作符                        |      说明                                                                                  | 
  4. -------------------------------------------------------------------------------------------------------------- 
  5. |    +                       |包含,词必须存在                                                                              
  6. |     -                      |排除,词必须不出现                                                                         
  7. |     >                      |包含,而且增加等级值                                                                       
  8. |     <                      |包含,且减少等级值                                                                           
  9. |     ()                      |把词组成子表达式(允许这些子表达式作为一个组被包含,排除,排列等) 
  10. |      ~                     |取消一个词的排序值  
  11. |     *                       |词尾的通配符 
  12. |     " "                     |定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)   
  13. ---------------------------------------------------------------------------------------------------------------- 

使用方法如下:

  1. SELECT * FROM articles WHERE MATCH (title,body) 
  2.  
  3.      AGAINST ('+apple -banana' IN BOOLEAN MODE); 

+ 表示AND,即必须包含,- 表示NOT,即不包含,代码如下:

  1. SELECT * FROM articles WHERE MATCH (title,body) 
  2.  
  3.      AGAINST ('apple banana' IN BOOLEAN MODE); 

apple和banana之间是空格,空格表示OR,即至少包含apple、banana中的一个,代码如下:

  1. SELECT * FROM articles WHERE MATCH (title,body) 
  2.  
  3.      AGAINST ('+apple banana' IN BOOLEAN MODE); 

必须包含apple,但是如果同时也包含banana则会获得更高的权重,代码如下:

  1. SELECT * FROM articles WHERE MATCH (title,body) 
  2.  
  3.      AGAINST ('+apple ~banana' IN BOOLEAN MODE); 

~ 是我们熟悉的异或运算符。返回的记录必须包含apple,但是如果同时也包含banana会降低权重。但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回,代码如下:

  1. SELECT * FROM articles WHERE MATCH (title,body) 
  2.  
  3.      AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE); 

返回同时包含apple和banana或者同时包含apple和orange的记录。但是同时包含apple和banana的记录的权重高于同时包含apple和orange的记录。

MySQL对中文全文索引无法正确支持,下面再介绍一个插件,利用mysqlcft 实现中文全文搜索.

Mysqlcft 是为 MySQL 5.1.22 ~ 5.1.25 RC 开发的中文全文索引插件,用于解决MySQL无法正确支持中文全文检索的问题.

1、优点:

•精准度很高:采用自创的“三字节交叉切分算法”,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%...%"的准确率。

•查询速度快:查询速度比LIKE '%...%"搜索快3~50倍,文章末尾有测试结果;

•标准插件式:以MySQL 5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL的其他功能,可快速跟进MySQL新版本;

•支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RC;

•支持字符集:支持包括GBK、GB2312、UTF-8、Latin1、BIG5在内的MySQL字符集(其他字符集没有测试过);

•系统兼容好:具有i386和x86_64两个版本,支持32位(i386)和64位(x86_64)CPU及Linux系统;

•适合分布式:非常适合MySQL Slave分布式系统架构,无词库维护成本,不存在词库同步问题。

2、缺点:

•mysqlcft中文全文索引只适用于MyISAM表,因为MySQL只支持对MyISAM表建立FULLTEXT索引;

•MySQL不能静态编译安装,否则无法安装mysqlcft插件;

•基于“三字节交叉切分算法”的索引文件会比海量、ft-hightman等基于“中文分词算法”的索引文件稍大,但不是大很多。

根据我的测试,mysqlcft全文索引的.MYI索引文件是.MYD数据文件的2~6倍

插件下载:https://code.google.com/p/mysqlcft/.

Tags: mysql全文搜索 mysql中文搜索

分享到: