MYSQL8.0全文索引使用
- 概述:
在一堆文字中找到含有关键字的应用。当然也可以用以下语句实现:
SELECT * FROM <表名> WHERE <字段名> like ‘%ABC%’
但是它的效率太低,是全盘扫描。
Mysql 提供了更高效的方法全文索引(FULLTEXT) - 重要:
- Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和myisam均支持全文索引。
- 只有char、varchar、text类型字段能创建全文索引。
- 当大量写入数据时,建议先写入数据,后再建立全文索引,提高效率。
- Mysql内置ngram 解析器,可以解析中日韩三国文字。有汉字的一定要启用它。
- 英文分词用空格,逗号;中文分词用 ngram_token_size 设定,后面有讲解。
- 全文索引在引用前需要新设定下变量
均在my.ini文件中设定,在 [mysqld]的下面追加-
需要将搜索短语长度设定合适
// MyISAM
ft_min_word_len = 4; 默认值
ft_max_word_len = 84; 默认值// InnoDB
innodb_ft_min_token_size = 3; 默认值
innodb_ft_max_token_size = 84; 默认值//ngram解析器令牌长度----即aiginst()中字符串切分的最小字符长度
ngram_token_size = 2~10 ; 默认值
一般设定:(以下例子均是假定设置如下)
在 [mysqld]的下面追加:
innodb_ft_min_token_size = 1
ft_min_word_len = 1
ngram_token_size = 1 -
设定好后需要关闭mysql服务,再重启mysql服务。在全文查询前,需要先将全文索引删除(如果有),再重新建。
-
- 创建全文索引
建议建表后新建
ALTER TABLE <表名> add FULLTEXT INDEX <索引名>(字段名1,字段2,,) [ WITH PARSER ngram]; - 全文索引查询
SELECT <字段表> FROM <表名> WHERE MATCH(字段) AGAINST (‘要搜索的关键词’ 搜索模式);
三种全文搜索模式:-
自然语言模式,默认,一般省略不写
IN NATURAL LANGUAGE MODE,
例子1:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (‘张三’ );
查找包含张,或三,或张三的记录,与‘+张三’ ,张三”,+张三” 结果相同 -
布尔搜索模式:
IN NATURAL LANGUAGE MODE
《+》----------必须包含此字符串
《-》----------必须不包含此字符串
《“ ”》--------双引号内作为整体不能拆词
《*》---------通配符,匹配任意字符
例子1:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (‘张三’ IN BOOLEAN MODE);
查找含有张三的记录,与‘+张三’,的结果都相同
例子2:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (’“张三”’ IN BOOLEAN MODE);
查找包含张三的记录,“张三”作为整体,与+”张三”结果相同,与上面例一的结果也相同。
例子3:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (’+“美女” & +“动人”’ IN BOOLEAN MODE);
查询有‘美女’的又有‘动人’的记录,“美女"与"动人”
例子4:
SELECT foldID,foldName FROM fold WHERE MATCH(foldName) AGAINST (’“美女” & “动人”’ IN BOOLEAN MODE);
查询有‘美女’的或有‘动人’的记录,“美女"或"动人” -
查询扩展搜索,使用较少bufen
搜索字符串用于执行自然语言搜索,然后,搜索返回的最相关行的单词被添加到搜索字符串,并且再次进行搜索,查询将返回来自第二个搜索的行。 -
总结:
a) 对于布尔模式,默认采用整体方式。
b) 对于自然模式,默认不采用整体方式。
-
文中如有不正确之处还请告知:376372062@qq.com ,不胜感谢。
部分参考出处:参考出处