首页 > 数据库 > MySQL > 正文

mysql全文搜索中文应用

2024-07-24 12:38:16
字体:
来源:转载
供稿:网友

今天要介绍的就是mysql全文搜索的应用,全文检索的表的存储引擎类型必须为MyISAM,否则不能做全文搜索.

首先用下面表举例,代码如下:

  1. CREATE TABLE articles (02.id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,03.title VARCHAR(200),04.body TEXT,05.FULLTEXT (title,body)06.) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

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

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

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

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

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

  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的记录.

linux中mysql中文全文搜索,代码如下:

  1. centos6 
  2. xampp1.7.7 
  3. mysql5.5 
  4.  
  5. # /opt/lampp/bin/mysql -uroot -ppassword 
  6.  
  7. mysql> SHOW VARIABLES LIKE 'plugin_dir'
  8. --插件路径:/opt/lampp/lib/mysql/plugin 
  9.  
  10. # wget http://mysqlcft.googlecode.com/files/mysqlcft-1.0.0-x86_64-bin.tar.gz 
  11. # tar zxvf mysqlcft-1.0.0-x86_64-bin.tar.gz 
  12. # cp mysqlcft.so /opt/lampp/lib/mysql/plugin 
  13.  
  14. # /opt/lampp/bin/mysql -uroot -ppassword 
  15. mysql> INSTALL PLUGIN mysqlcft SONAME 'mysqlcft.so'
  16. mysql> SELECT * FROM mysql.plugin; 
  17. mysql> SHOW PLUGINS; 
  18.  
  19.  
  20. ALTER IGNORE TABLE articles ADD FULLTEXT INDEX cnFullIndex (title,body) WITH PARSER mysqlcft; 
  21.  
  22. SELECT * FROM articles WHERE MATCH(title,body) AGAINST ('北京' IN BOOLEAN MODE

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表