赞
踩
- 要想对某个给定表进行全文搜索,则必须事先为它创建一个特殊类型的索引,这种索引具有以下几个方面的特点
- 全文搜索基于FULLTEXT索引:
- 在MySQL 5.5里,这些索引只能针对MylSAM类型的表创建。MySQL 5.6引入了对InnoDB的全文捜索支持。
- 在FULLTEXT索引里,只能包含CHAR、VARCHAR和TEXT这几种类型的列。
- 全文搜索将会忽略掉那些常见词:
- 这里的“常见”指的是“至少在一半的行里都出现过”。牢记这一点很重要,尤其是当你在建立测试表,以体验FULLTEXT功能的时候。
- 在测试表里,你至少需要插入3个行。如果那个表只有一两个行,那么它里面的每个单词将至少有50%的出现几率,所以对它进行全文搜索将不会得到任何结果!
- 有些内建的常用单词,如“the”、“after”和“other”等。它们都被称为“停用词”(stopword),在进行全文搜索时总是会被忽略掉。
- 太短的单词也会被忽略。默认情况下,“太短”指少于4个字符。不过,你可以重新配置服务器,把这个最小长度设置为其他值。更多相关信息请参考2.14.4节。
- 全文搜索对“单词”的定义是,它们是由字母、数字、撇号和下划线构成的字符序列:
- 这意味着会把像“Mi-blooded”这样的字符串当成两个单词——"full"和“blooded”。一般情况下,全文搜索会匹配整个单词,而不会匹配部分单词。
- 通常情况下,只要在某个行里找到了搜索字符串里的某个单词,那么FULLTEXT引擎便会认为这个行与搜索字符串相匹配。
- 如果你使用的是布尔式全文搜索,那么你可以加上一些额外的约束条件,如要求所有的单词都必须存在(或者以任何顺序,或者严格按照捜索字符串里的顺序进行短语搜索)。还可以用布尔搜索来匹配那些不包含特定单词的行,或者通过添加一个通配符来匹配所有以一个给定前缀开头的单词。
- 可以为单个列或多个列创建FULLTEXT索引:
- 如果它涉及多个列,基于该索引的搜索将在所有列上同进行。反过来也就是说,在进行全文搜索时,你给出的列列表必须和某个FULLTEXT索引所匹配的那些列精确匹配。
- 例如,有时想捜索col1,有时想搜索col2,而有时想同时捜索col1和col2;那么,这时你需要创建3个索引,即两个列各占一个,而两个列的组合需要占一个。
- # create, load, index theh apothegm table
- DROP TABLE IF EXISTS apothegm;
- #@ _SETUP_TABLE_
- CREATE TABLE apothegm (attribution VARCHAR(40), phrase TEXT) ENGINE=MyISAM;
- LOAD DATA LOCAL INFILE 'apothegm.txt' INTO TABLE apothegm;
- ALTER TABLE apothegm
- ADD FULLTEXT (phrase),
- ADD FULLTEXT (attribution),
- ADD FULLTEXT (phrase, attribution);
- #@ _SETUP_TABLE_
- Aeschylus Time as he grows old teaches many lessons
- Alexander Graham Bell Mr. Watson, come here. I want you!
- Benjamin Franklin It is hard for an empty bag to stand upright
- Benjamin Franklin Little strokes fell great oaks
- Benjamin Franklin Remember that time is money
- Miguel de Cervantes Bell, book, and candle
- Proverbs 15:1 A soft answer turneth away wrath
- Theodore Roosevelt Speak softly and carry a big stick
- William Shakespeare But, soft! what light through yonder window breaks?
- Robert Burton I light my candle from their torches.
- SELECT * FROM apothegm WHERE MATCH(attribution) AGAINST('roosevelt');
- SELECT * FROM apothegm WHERE MATCH(phrase) AGAINST('time');
- SELECT * FROM apothegm WHERE MATCH(attribution, phrase) AGAINST('bell');
SELECT COUNT(*) FROM apothegm WHERE MATCH(phrase) AGAINST('time');
MATCH的相关度
- 当你在WHERE子句里使用MATCH表达式时,对于自然语言类型的全文搜索,其输出行是按照相关程度递减顺序排列的。
- 相关度是一个非负浮点数,其中零代表“毫不相关”。要想査看这些值,可以在输出列的列表里加上一个MATCH表达式:
SELECT phrase, MATCH(phrase) AGAINST('time') AS relevance FROM apothegm;
SELECT * FROM apothegm WHERE MATCH(phrase) AGAINST('hard soft');
SELECT * FROM apothegm WHERE MATCH(phrase) AGAINST('hard soft' IN NATURAL LANGUAGE MODE);
布尔模式搜索的几个特点
- “50%规则”不再起作用。即使找到的单词会出现在一半以上的行里,仍然会把它们搜索出来。
- 査询结果不再按相关程度排序。
- 搜索可以要求短语里的所有单词都必须是按某种特定的顺序出现。如果想要匹配一个短语,那么需要把它用双引号引起来。只有在行包含的那些单词及其顺序与短语里列出的内容一致时,才会被认为是匹配上了:
SELECT * FROM apothegm WHERE MATCH(attribution, phrase) AGAINST('bell book and candle' IN BOOLEAN MODE);
- 也可以对未被包括在FULLTEXT索引里的那些列,进行布尔模式的全文搜索,只是这样做会比对索引过的列进行捜索要慢一些。
- SELECT * FROM apothegm WHERE MATCH(attribution, phrase) AGAINST('bell');
- SELECT * FROM apothegm WHERE MATCH(attribution, phrase) AGAINST('+bell -candle' IN BOOLEAN MODE);
SELECT * FROM apothegm WHERE MATCH(phrase) AGAINST('soft*' IN BOOLEAN MODE);
- SELECT * FROM apothegm WHERE MATCH(attribution, phrase) AGAINST('bell book');
- SELECT * FROM apothegm WHERE MATCH(attribution, phrase) AGAINST('bell book' WITH QUERY EXPANSION);
- 假设想要把最小单词长度从4改成3,那么可按以下步骤进行操作。
- (1)把ft_ndn_word_len变量设置为3,重启服务器。如果想让这个设置在每次服务器重启时都能生效,那么最好的办法是把这个设置放到某个选项文件里,如/etc/nv.cnf文件:
[mysqld] ft_min_word_len=3
- (2)对于那些已经建立了FULLTEXT索引的表,必须重建这些索引。你可以先删除这些引,然后再重建它们,但更为简易有效的办法是执行一次快速修复操作:
REPAIR TABLE tbl_name QUICK;
- (3)所有在更改参数后新创建的FULLTEXT索引,将自动使用这个新值。
说明
- 如果想使用myisamchk程序为某个包含有FULLTEXT索引的表重建索引,那么可以参考附录F,其中在对myisamchk进行描述时包含了一些与FULLTEXT索引有关的注意事项。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。