Mysql全文检索
存储引擎对比
MySQL内置了三种存储引擎,分别是InnoDb,MyIsam和MEMORY,一般情况下,MySQL5.X之后的版本都是使用InnoDb存储引擎.
三种引擎的对比
InnoDb
- 支持事务操作
- 支持自动增加列
- 具有行级锁定
MyIsam
- 不支持事务,也不支持外键,但是访问速度快
- 对大文本搜索性能较好
Memory
- 目标数据较少,而且需要频繁的被访问
- 采取的存储介质是系统内存,因此访问速度快,但是现在可以使用第三方内存型数据库代替
大文本的读取
综上所述,大文本的数据需要采用MyIsam存储引擎作为存储.
测试例子:
CREATE TABLE IF NOT EXISTS product_desc
(
prod_id INT NOT NULL,
prod_text text,
FULLTEXT ( prod_text )
) ENGINE = MyIsam;
建立索引可以在创建表时,直接添加,也可以在数据全部导入完毕之后再创建索引.一般而言,后面一种比前面一种的效率更好.
语法
使用Match()和Against()函数进行搜索.
例如:
select prod_text
from product_desc
where match(note_text) against('rabbit');
match中输入需要进行匹配的列,可以是多个列,against中输入需要匹配的关键词,一般搜索出来的结果不区分大小写.
MyIsam执行大文本的搜索还是很快的,是因为它内部对大文本建立了索引.
查看优先级
MyIsam内部究竟是怎么工作的呢?
select prod_text,match(note_text) against('rabbit') as 'rank'
from product_desc;
可以从得出的结果中看到:
- 词靠前的行比词靠后的行的等级优先值更高
MyIsam内部会存在一些常见无意义的词进行过滤,不做索引- 搜索出来的结果会根据唯一词/索引中词等的总数进行显示
扩展查询
select prod_text
from product_desc
where match(note_text) against('rabbit' with query expansion);
搜索出来的结果不仅除了有关键词之外,还有是关键词当前所在的行所存在的关键词,然后依据这些关键词从数据库取出来的结果.
布尔文本高级搜索
全文本布尔操作符
| 布尔操作符 | 说明 |
|---|---|
| + | 包含,表示单词必须存在 |
| - | 排除,表示单词必须不存在 |
| > | 包含,而且需要增加单词的优先级 |
| < | 包含,但是需要减少单词的优先级 |
| ~ | 取消词的排序值 |
| * | 词尾的通配符 |
| “” | 定义一个短语 |
语法
案例:
select prod_text
from product_desc
where match(note_text) against('+rabbit' in Boolean Mode);
搜索当中添加了in Boolean Mode几个关键词,表示启用布尔搜索
注意:
- 索引全文本时,三个及三个以下的字符的单词是被索引忽略的
- MySQL内部维护了一个非用词(stopword)列表,这些词在索引时将被忽略
- 许多词出现的频率很高,搜索他们没有用处,因此当一个词出现在50%以上的行中,将被忽略
- 表中的行数少于三行,全文本搜索不返回结果
- 忽略单词中的单引号

浙公网安备 33010602011771号