MySQL的全文本搜索

我们在使用MySQL时,一般会用到两种引擎--MyISAM和InnoDB,MyISAM支持全文本搜索,但不支持事务处理;而InnoDB支持事务处理,但不支持全文本搜索。 
一、有时,我们需要使用全文本搜索,例如:要搜索文本中存在指定的某个词,且以这个词出现的顺序排序。 
先创建支持全文本搜索的表: 
CREATE TABLE product_notes 

  note_id  int  NOT NULL AUTO_INCREMENT, 
  note_date datetime NOT NULL, 
  note_text text NULL, 
  PRIMARY KEY(note_id), 
  FULLTEXT(note_text) 
) ENGINE=MyISAM; 
注意:要使用全文本搜索,引擎一定要是MyISAM(ENGINE=MyISAM)。 
在note_text字段定义了全文本搜索功能后,MySQL会自动为这列添加索引,并维护该索引。在增加,更新或删除行时,索引随之自动更新。 
假设product_notes表中已经有了数据,现在我们来使用全文本查询: 
SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('rabbit'); 
这条语句检索出note_text字段包含rabbit的行。类似于: 
SELECT note_text 
FROM product_notes 
WHERE note_text like '%rabbit%'; 
两者的区别在于使用like查询仅仅只返回包含‘rabbit’的行,而使用全文本会按'rabbit'在文本中出现的顺序排序,这是like所做不到的。例如(假设note_text字段存在下两列包含rabbit的行): 
1:A fat rabbit 
2:A rabbit 
用全文本搜索出来就的排序就会这样 
2:A rabbit 
1:A fat rabbit 
因为2中的rabbit前面只有一个词,而1中的有两个,所以2的优先级高,自然排在前面。 
可以查看优先级 
SELECT note_text 
     ,Match(note_text) Against('rabbit') AS rank 
FROM product_notes 
返回: 
  note_text      rank 
1:A fat rabbit   1.6403435232543 
2:A rabbit       1.5935389274914 
3:A good day                   0 
4:To do it                     0 

二、使用查询扩展 
SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION); 
返回: 
2:A rabbit 
1:A fat rabbit 
3:A good day 
因为3存在一个A,所以也被查询出来了。 

三、布尔文本搜索 
布尔操作符    描述 
+           包含指定值 
-           排除指定值 
>           包含指定值,并且增加优先级值 
<           包含指定值,并且减少优先级值 
()          把词组成表达式 
~           取消一个词的排序值 
*           词尾的通配符 
""          定义一个短语 
下面给出一些例子: 
SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('+rabbit +fat' IN BOOLEAN MODE); 
返回: 
2:A fat rabbit 
文本包含rabbit和fat的行 

SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('rabbit -fat' IN BOOLEAN MODE); 
返回: 
2:A rabbit 
排除文本中存在fat的行。 

SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('rabbit good' IN BOOLEAN MODE); 
返回: 
2:A rabbit 
1:A fat rabbit 
3:A good day 
没有指定操作符,搜索包含rabbit或good的行。 

SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('"fat rabbit"' IN BOOLEAN MODE); 
返回: 
2:A fat rabbit 
文本包含"fat rabbit"的行。 

SELECT note_text 
FROM product_notes 
WHERE Match(note_text) Against('+fat +(>rabbit)' IN BOOLEAN MODE); 
返回: 
2:A fat rabbit 
文本包含fat和rabbit的行,且减少后者的优先级值。 

四、全文本搜索使用说明 
1、指定值出现在行中的频率少于50% 
2、忽略MySQL的内建非用词(stopword) 
3、忽略单引号,如:fa't 搜索为fat 
4、不具有词分隔符的语言(如:日语和汉语)不能恰当地返回全文本搜索结果 
5、引擎必须是MyISAM类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值