mysql大文本搜索

存储引擎对比

MySQL内置了三种存储引擎,分别是InnoDb,MyIsamMEMORY,一般情况下,MySQL5.X之后的版本都是使用InnoDb存储引擎.

三种引擎的对比

InnoDb

  1. 支持事务操作
  2. 支持自动增加列
  3. 具有行级锁定

MyIsam

  1. 不支持事务,也不支持外键,但是访问速度快
  2. 对大文本搜索性能较好

Memory

  1. 目标数据较少,而且需要频繁的被访问
  2. 采取的存储介质是系统内存,因此访问速度快,但是现在可以使用第三方内存型数据库代替

大文本的读取

综上所述,大文本的数据需要采用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;

可以从得出的结果中看到:

  1. 词靠前的行比词靠后的行的等级优先值更高
  2. MyIsam内部会存在一些常见无意义的词进行过滤,不做索引
  3. 搜索出来的结果会根据唯一词/索引中词等的总数进行显示

扩展查询


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几个关键词,表示启用布尔搜索

注意:

  1. 索引全文本时,三个及三个以下的字符的单词是被索引忽略的
  2. MySQL内部维护了一个非用词(stopword)列表,这些词在索引时将被忽略
  3. 许多词出现的频率很高,搜索他们没有用处,因此当一个词出现在50%以上的行中,将被忽略
  4. 表中的行数少于三行,全文本搜索不返回结果
  5. 忽略单词中的单引号
  6. 仅在MyIsam存储引擎中支持全文本搜索

你可能感兴趣的:(Java,mysql)