跟我一起学习MySQL技术内幕(第五版):(第二章学习日记13)

2.14使用 fulltext搜索
啥卡拉卡 第二章最后一记 五一快乐 劳动人民最光荣

MySQL具备全文搜索的能力,在不使用模板匹配操作的情况下进行单词或短语的查找
三种类型:
1.自然语言搜索:MySQL会把搜索字符串解析成一系列的单词,然后搜索出包含这些单词的那些行。
2.布尔模式搜索。在搜索字符串里那些单词可以包含修饰字符,用以表明某些特定的要求。
3.查询扩展线索。分两个阶段。第一阶段是自然语言搜索,第二阶段则先把原来的搜索字符串,与在第一阶段的搜索里高度匹配的那些航连接在一起,然后再进行一次搜索(这样可以扩大所搜范围,把那些与原有字符串相关、单用这些字符串匹配不到的那些行也找出来)

如果要对某个给定表进行全文搜索,则必须事先为它创建一个特殊类型的索引,这种索引有如下特点:
1.只包含char varchar text这几种类型的列
2.全文搜索会忽略掉常见词。(测试表里至少需要插入3个行,如果只有一两个行,那么单词的概率都会是50%以上,全文搜索将不会有任何结果)
3.内建的常用单词,‘the’ ‘after’ ‘other’等停用词(stopword)在进行全文搜索时会被忽略调查。
4.少于四个字符的单词会被自动忽略(默认),也可以自己设置
5.全文搜索对单词的定义是,他们是有字母、数字、撇号、下划线构成的字符序列。其他的字符则会将前后分开。
6.可以为单个列或者多个列创建fulltext索引

在MySQL5.5这些索引只能针对MyISAM类型的表,在5.6中提供了innodb的全文搜索支持,但是这本书还是针对MyISAM类型的表。

下面是全文搜索的示例

假设有一个apothegm.txt的数据文件其中是一些名人及他们的名言信息:

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.

如果按照 名人 名言 名人加名言 来搜索,就需要创建三个索引。下面创建表并进行填充和索引:

DROP TABLE IF EXISTS apothegm;
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);

2.14.1自然语言fulltext搜索

match可以用来列出一个或多个用于搜索的列,并用against()指定搜索字符串,对表进行自然语言类型的全文搜索。例如:

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 phrase ,match(phrase) against ('time') as relevance from apothegm;

自然语言模式是默认的全文搜索模式。如果想要显式的指定这个模式,可以在搜索字符串的后面机上in natural language mode。

select * from apothegm where match (phrase) against ('hard soft' in natural language mode) ;

2.14.2布尔模式的全文搜索
通过使用布尔模式的全文搜索,可以获得对多单词所搜的更多控制。要完成这种类型的搜索,需要在against()函数里搜索字符串的后面添加 in boolean mode 。
布尔搜索模式特点如下:
1.50%规则不再起作用。
2.查询结果不再按相关程序安排。
3.搜索可以要求短语里的所有单词都必须是按某种特定的顺序出现,匹配一个短语需要把它用双引号引起来,搜索时单词及其顺序都一致时才会被认为是匹配上了。
4.停用词会被忽略掉。

select * from apothegm where match (attribution,phrase) against(' "bell book and candle " ' in boolean mode) 

4.也可以对未被包括在fulltext里的那些列进行布尔模式的全文搜索(较慢)
5.可以添加修饰词:‘+’表示该单词必须有,‘-’表示该单词不能出现在该匹配行里'+ bell - candle'

select * from apothegm where match (attribution,phrase) against ('+bell -candle' in boolean mode);

’ * ‘是一个通配符,只要单词以该搜索单词开头的,那么这些行就是匹配的,不过不能用这个通配符功能来匹配那些比索引单词长度更短的单词

select * from apothegm where match (phrase) against('soft*' in boolean mode);

2.14.3查询扩展全文搜索
第一阶段全文搜索 ,之后相关度最高的行会被用于第二阶段的搜索。这些行里原有的单词会与原来的搜索单词一起使用,完成第二阶段的搜索。
完成这种搜索需要在搜索字符串后边加上with querty expansion。

select * from apothegm where match(attribution , phrase) against( 'bell book' );

结果如下:

Miguel de Cervantes     Bell, book, and candle
Alexander Graham Bell   Mr. Watson, come here. I want you!

扩展全文搜索:

select * from apothegm where match(attribution , phrase) against( 'bell book' with query expansion);

结果如下:

Miguel de Cervantes     Bell, book, and candle
Alexander Graham Bell   Mr. Watson, come here. I want you!
Robert Burton           I light my candle from their torches.

发现该查询多了一行 原因就是candle 这个单词存在于第一个自然语言搜索找到的行里。第二阶段时根据bell book candle这四个单词最终找到了这三行。

2.14.4配置全文搜索引擎
可以通过设置系统变量的办法进行修改。变量ft_min_word_len 和ft_max_word_len 用于确定fulltext索引里的那些单词所具有的最小和最大长度。默认值是4和84.
想要把最小值设置为3:
1.把这个设置放置到某个选项文件夹里如/etc/my.cnf文件:

[mysqld]
ft_min_word_len=3

2.对于那些已经建立了fulltext索引的表,必须重建这些索引、可以使用快速修复:

repair table table_name quick; 

3.所有在更改参数后新创建的fulltext索引,将自动使用这个新值。

注:设置系统变量附录D 选项文件附录F

你可能感兴趣的:(mysql)