1、Mysql 全文本搜索使用引擎MyISAM,要进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后,Mysql会自动进行所有的索引和重新索引。
在索引之后,SELECT可与Match()和Against()一起使用以实际执行索引。Match()指定要搜索的列,Against()指定搜索表达式。例:
输入:mysql> select note_text
-> from productnotes
-> where match(note_text) against('rabbit');
输出:|note_text|
| Customer complaint: rabbit has been able to detect trap, food apparently less effective now.|
| Quantity varies, sold by the sack load.All guaranteed to be bright and orange, and suitable for use as rabbit bait. |
2、查询扩展
用来设法放宽所返回的全文本搜索结果的范围(关键词 WITH QUERY EXPANSION)。
使用时Mysql对数据和索引进行两遍扫描来完成搜索:
首先,进行一个基本的全文本搜索,找出搜索条件匹配的所有行;
其次,Mysql检查这些匹配行并选择所有有用的词。
再次,Mysql再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。
利用查询扩展,能找出可能相关的结果,即使他们并不精确包含所查找的词。
3、布尔文本搜索 (关键词 IN BOOLEAN MODE)
以布尔方式可以提供如下内容的细节:
要匹配的词;要排斥的词(如果某行包含这个词,则不返回该行,即使她包含其他指定的词也是这样);排列提示(指定某些词比其他词更重要,更重要的词等级更高);表达式分组等。
布尔操作符 | 说明 |
+ | 包含,词必须存在 |
- | 排除,词必须不出现 |
> | 包含,而且增加等级值 |
< | 包含,且减少等级值 |
() | 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
~ | 取消一个词的排序值 |
* | 词尾的通配符 |
" " | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |
例:
输入:mysql> select note_text
-> from productnotes
-> where Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);
输出:| note_text |
| Customer complaint:Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead. |
分析: -rope*指示Mysql排除包含rope*(任何以rope开始的词,包括ropes)的行。
关于全文本搜索的一些重要声明:
* 在索引全文本数据时,短词被忽略且从索引中排除。短语定义为那些具有3个或3个一下字符的词。
* Mysql带有一个内建的非用词(stopword)列表,这些词在索引全文数据时总是被忽略。如果需要,可以覆盖这个列表。
* 许多词出现的频率很高,搜索他们没有用处(返回太多的结果)。Mysql规定了一条50%规则,如果一个词出现在50%的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。
* 如果表中的行数少于3行,则全文搜索不返回结果。
* 忽略词中的单引号。如,don’t索引为dont
* 不具有词分隔符的语言不能恰当地返回全文本搜索结果。
* 仅在MyISAM数据库引擎中支持全文本搜索。