相关文章推荐
乐观的松球  ·  javascript - Using ...·  6 月前    · 
乐观的松球  ·  Katalon Help Center·  7 月前    · 
乐观的松球  ·  .Net ...·  7 月前    · 
乐观的松球  ·  jQuery html()方法有什么用·  8 月前    · 
乐观的松球  ·  vue i18n 占位符·  9 月前    · 
私奔的领结  ·  Android ...·  6 小时前    · 
暗恋学妹的投影仪  ·  Android ...·  6 小时前    · 
精明的茶叶  ·  拦截tablayout ...·  6 小时前    · 
傻傻的凳子  ·  TabLayout ...·  6 小时前    · 
温柔的野马  ·  XMLHttpRequest.withCre ...·  7 小时前    · 
mysql8全文检索应用之一:参数配置

mysql8全文检索应用之一:参数配置

我的网站用的mysql数据库版本:阿里云RDS mysql8.0,其它版本的参数配置可能有些许差异。

1、参数配置

1.1、修改mysql参数配置

进入阿里云RDS管理后台,进入参数配置,找到如下配置项并修改:

  • ft_min_word_len :默认值为4,改为1;
  • innodb_ft_min_token_size:默认值也是4,同样改为1;
  • ngram_token_size:默认值是2,如果不是2,改为2。

1.2、提交参数

修改完上面两个参数后,点击提交参数按钮,提示需要重启服务,如果是生产环境,需要谨慎处理。

2、创建索引

修改好mysql的配置以后,就可以创建全文索引了

2.1、创建full text索引

ALTER TABLE article ADD FULLTEXT INDEX article_fulltext (title,content) with parser ngram;

说明:

- (title,content)表示在title和content两列上加联合索引,如果有多列,用","分隔即可;

- 创建索引语句最后一定要加上with parser ngram

- 如果是用Navicat,添加索引的时候下方解析器一栏要填上:ngram,如下图:

navicat解析器设置

2.2、ngram解析器

如果要支持中文分词进行中文全文检索,在创建索引时必须用ngram解析器。

ngram解析器简单说明

  • 内置的MySQL全文解析器使用空格确定单词的开头和结尾。
  • 从版本5.7.6开始,MySQL包含ngram全文解析器作为内置服务器插件,要使用ngram解析器,需要在创建full text索引时加上 with parser ngram
  • 根据ngram_token_size参数,ngram按参数值对搜索词进行分词。

2.3、全文检索sql语句

select * from article_main where MATCH(title,content) against ("打字狗" in boolean mode);

注意:

  • 通过全文索引进行sql查询的语句和普通查询是有差别的
  • MATCH() ,需要进行匹配的字段,如果是innoDB表,这些字段必须都建有full text索引(可以是联合索引),例如:MATCH(title,conten)
  • against (),搜索字符串,例如:against(“打字狗 打字练习”)

3、全文检索模式

常用的全文检索模式有两种:

3.1、自然语言模式(NATURAL LANGUAGE MODE)

自然语言模式是MySQL 默认 的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。

3.2、BOOLEAN模式(BOOLEAN MODE)

BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。推荐使用boolean模式

3.3、MySQL布尔全文检索运算符

下表说明了全文检索布尔运算符及其含义:

操作者 描述
+ 包括,这个词必须存在。
- 排除,词不得出现。
> 包括,并提高排名值。
< 包括,并降低排名值。
() 将单词分组为子表达式(允许将它们作为一组包括在内,排除在外,排名等等)。
否定单词的排名值。
* 通配符在这个词的结尾。
“” 定义短语(与单个单词列表相对,整个短语匹配以包含或排除)。

使用布尔模式进行全文检索的搜索字符串示例:

示例 描述
'mysql tutorial' 要搜索包含两个单词中至少一个的行:mysql或tutorial
'+ mysql + tutorial' 要搜索包含两个单词的行:mysql和tutorial
'+ mysql tutorial' 要搜索包含单词“mysql”的行,但为包含“tutorial”的行添加更高的排名
'+ mysql -tutorial' 要搜索包含单词“mysql”但不包含“tutorial”的行
'+ mysql~tutorial' 要搜索包含单词“mysql”的行,如果它包含单词“tutorial”,则将行排名更低。
'+ mysql +(> tutorial <training)' 要以任何顺序搜索包含单词“mysql”和“tutorial”,或“mysql”和“training”的行,但将包含“mysql tutorial”的行放在“mysql training”之上。
'my*' 要查找包含以“my”开头的单词的行,例如“mysql”,“myyahoo”等

3.4、MySQL布尔全文检索主要功能

  • MySQL不会按照布尔全文检索中相关性降低的顺序自动对行进行排序。意思就是,需要自己通过order by子句进行排序。
  • 要执行布尔查询,InnoDB表要求 MATCH 表达式的所有列都有 FULLTEXT 索引。请注意,虽然搜索速度很慢,但MyISAM表并不需要这样。
  • MySQL在InnoDB表上的搜索查询中不支持多个布尔运算符,例如'++ mysql'。如果你这样做,MySQL将返回错误。但是,MyISAM有所不同,它会忽略其他运算符并使用最接近搜索词的运算符,例如,'+ -mysql'将变为'-mysql'。
  • InnoDB全文检索不支持尾随加号(+)或减号( - )。它只支持前导加号或减号。如果搜索单词是'mysql +'或'mysql-',MySQL将返还错误。此外,带有通配符的以下前导加号或减号无效:+ *,+ -
  • 50%阈值。50%阈值意味着如果一个单词出现在超过50%的行中,MySQL将在搜索结果中忽略它。


我的网站上用mysql fulltext做的文章全文检索:

打字练习文章列表: 打字练习文章列表

在线打字练习 打字测试 网站:打字狗(dazigo.vip)

下一篇( mysql8全文检索应用之二:mybatis-plus )将介绍在mybatis-plus下如何进行全文检索。

编辑于 2022-06-06 19:35
 
推荐文章