全文本搜索
- 使用全文本(fulltext)搜索,MySQL不需要分别查看每个行,不需要分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行,提高搜索效率。
- 不是所有引擎都支持全文本搜索,常用的搜索引擎中MyISAM支持全文本搜索,InnoDB不支持。
使用全文本搜索
- 在创建表时启用全文本搜索:
create table table_name
(
...
fulltext(column_name)//指定列,可以是多个列
)
- 进行全文本搜索
select note_text
from productnotes
where match(note_text) against('rabbit');
传递给match()的值必须与FULLTEXT中的值相同,如果为多个列,则必须列出它们并且按照定义的顺序
可以根据等级对结果排序
select note_text,
match(note_text) against('rabbit') as rank
from productnotes;
查询扩展
放宽所返回的全文本结果的范围
- 搜索原理
1.先进行一遍基本的全文本搜索,找出与条件匹配的行;
2.MySQL检查这些行并选择所有有用的词;
3.在进行一次全文本搜索,不仅使用原来的条件还是用所有找出的有用的词 - 举个例子
select note_text
from productnotes
where match(note_text) against('anvils' with query expansion);
布尔文本搜索
- 布尔方式的搜索可以在条件定义
要匹配的词
要排斥的词
排列提示(提示某些词比较重要)
表达式分组
其他 - 布尔文本搜索条件中的操作符
+:包含,词必须出现
-:排斥,词必须不出现
‘>’:包含,并且增加等级
<:包含,并且减少等级
():将词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~:取消一个词的排序值
*:词尾的通配符
" ":定义一个短语(匹配时匹配整个短语) - 举例说明
包含heavy并且不包含任何一rope开头的词
select note_text
from productnotes
where match(note_text) against('heavy -rope*' in boolean mode);
包含rabbit和bait中至少一个词
select note_text
from productnotes
where match(note_text) against('rabbit bait' in boolean mode);
匹配短语rabbit bait
select note_text
from productnotes
where match(note_text) against("'rabbit bait'" in boolean mode);
搜索safe和combination,降低后者的等级
select note_text
from productnotes
where match(note_text) against('+safe +(<combination)' in boolean mode);