MySQL全文索引的使用(MySQL5.6或MariaDB10.0.5版本以上支持InnoDB)

MySQL全⽂索引的使⽤(MySQL5.6或MariaDB10.0.5版本以上⽀持InnoDB)简介
在做性能调优时,必不可少的⼀个环节便是数据库调优,⽽数据库索引的使⽤可以⼤⼤提升信息的检索效率,我们经常使⽤的⼀般是对某列建⽴聚簇索引或者Hash索引,这样能⼤⼤提升信息的查询速度。在⼀些场景下我们不仅仅满⾜于对单列单词的检索,⽐如我们需要对某个字段做实时的全⽂检索,数据量很⼩直接⽤like %xxx%也是可以解决的。但是如果数据量进⼀步变⼤,⽐如说达到⼏百万条记录时,我们便可以使⽤MySQL⾃带的全⽂索引满⾜我们的简单检索需求。如果数据再⼤⼀些我们就需要⽤像类似elasticsearch这种专门⽤于实时分词检索数据库了。本⽂主要讲解如何使⽤MySQL(MariaDB)提供的全⽂索引实现⼀个简单的搜索引擎。
本⽂内容有
数据库版本要求
全⽂索引分词配置设置
全⽂索引语法说明
全⽂索引如何⽀持中⽂分词被禁止的爱
全⽂索引使⽤⽰例
参考⽂章
1、数据库版本要求
1.1 MySQL 版本要求
5.6版本之后InnoDB存储引擎开始⽀持全⽂索引,5.7版本之后通过使⽤ngram插件开始⽀持中⽂。之前仅⽀持英⽂,因为是通过空
⽩字符、英⽂逗号、句点等等作为分词的分隔符,对于中⽂来说是不合适的
MySQL允许在char、varchar、text类型上建⽴全⽂索引,全⽂索引对MyISAM和InnoDB引擎有效。
1.3 MariaDB版本要求
MariaDB 从10.0.5版本之后,InnoDB开始⽀持全⽂索引,MariaDB从10.0.15版本之后,mroonga也开始⽀持全⽂索引, 和存储引擎也⽀持全⽂索引功能。其他使⽤⽅法跟MySQL类似,mroonga存储引擎⽀持中⽂分词
2、全⽂索引分词配置设置
查看数据库全⽂索引默认配置
SHOW VARIABLES LIKE'%ft%';
####结果####
aria_force_start_after_recovery_failures 0
ft_boolean_syntax +-><()~*:""&|
ft_max_word_len 84
ft_min_word_len 4#默认为4个字符才进⾏分词
ft_query_expansion_limit 20
ft_stopword_file (built-in)
innodb_ft_aux_table
innodb_ft_cache_size 8000000
innodb_ft_enable_diag_print OFF
innodb_ft_enable_stopword ON
innodb_ft_max_token_size 84
innodb_ft_min_token_size 3#如果是InnoDB存储引擎默认3个字符开始分词
innodb_ft_num_word_optimize 2000
innodb_ft_result_cache_limit 2000000000
innodb_ft_server_stopword_table
innodb_ft_sort_pll_degree 2
innodb_ft_total_cache_size 640000000
innodb_ft_user_stopword_table
修改分词最⼩字符数为2
#myf⽂件中的:[mysqld]后⾯加上上⾯的两个参数
innodb_ft_min_token_size=2
氢氧化铁ft_min_word_len=2
#然后重启数据库即可⽣效
3、全⽂索引语法说明
全⽂搜索把任何数字、字母、下划线序列看作是单词,还可以包含“’”如aaa’bbb备解析为⼀个单词,但aaa’’bbb备解析为两个单词,FULLTEXT解析器⾃动移除⾸尾的“’”,如’aaa’bbb’被解析为aaa’bbb。FULLTEXT解析器⽤“ ”(空格)、“,”(逗号)“.”(点号)作为默认的单词分隔符,因此对于不使⽤这些分隔符的语⾔如汉语来说FULLTEXT解析器不能正确的识别单词,对于这种情况需做额外处理。
全⽂搜索中⼀些单词会被忽略。⾸先是过短的单词,InnoDB全⽂搜索中默认为3个字符,MyISAM默认4个字符,可通过在创建FULLTEXT索引前改变配置参数来改变默认⾏为,对于InnoDB该参数为:innodb_ft_min_token_size,对于MyISAM为
ft_min_word_len;另外stopword列表中的单词会被忽略。stopword列表包含诸如“the”、“or”、“and”等
常⽤单词,这些词通常被认为没有什么语义价值。MySQL由内建的停⽌字列表,但是可以所使⽤⾃定义的停⽌字列表来覆盖默认列表。对于InnoDB控制停⽌字的配置参数为innodb_ft_enable_stopword,innodb_ft_server_stopword_table, innodb_ft_user_stopword_table对于MyISAM参数为ft_stopword_file。
⽂本集合和查询语句中的单词的权重由该单词在集合或语句中的重要性确定。单词在越多的⾏中出现则该单词的权重越低,因为这表明其在⽂本集合中的语义价值较⼩。反之权重越⾼。
查询语法
SELECT * FROM 表名 WHERE MATCH (列名1,…,列名N) AGAINST (‘关键词1,…,关键词N’ 查询模式关键字);
3.1 索引的建⽴
单列索引
>## 建表时使⽤如下格式 >##
FULLTEXT(column_name)
#或者
FULLTEXT KEY index_name(column_name)
>## 修改表结构使⽤如下格式 >###
ALTER TABLE table_name ADD FULLTEXT INDEX index_name(column_name);
多列索引
>## 建表时使⽤如下格式 >##
FULLTEXT(column_name1,column_name2)
#或者
FULLTEXT KEY index_name(column_name1,column_name2)
>## 修改表结构使⽤如下格式 >###
ALTER TABLE table_name ADD FULLTEXT INDEX index_name(column_name1,column_name2);
3.2 查询⽅式
⾃然语⾔模式 ( IN NATURAL LANGUAGEMODE )
遵从⾃然语⾔分词规则,匹配完整的单词,查询关键字也会根据分词规则⾃动分词,只要匹配分词后的各个单词中其中任意⼀个便可以查询到记录,默认就是这种模式
少林传人
where条件后接MATCH(column_name1,column_name2) AGAINST('keyword')
#或者
where条件后接MATCH(column_name1,column_name2) AGAINST('keyword'IN NATURAL LANGUAGE MODE)
eg1. MATCH(food_name) AGAINST(‘apple’) 可以匹配出 apple,apples,Apples 等完整单词
eg2. MATCH(food_name) AGAINST(‘apple orange’) 可以匹配出 apple,apples,Apples 、orange、oranges、
Oranges等完整单词
布尔全⽂搜索 ( IN BOOLEAN MODE )
如果在AAGAINST()函数中指定了IN BOOLEN MODE模式,则MySQL会执⾏布尔全⽂搜索。在该搜索模式下,待搜索单词前或后的⼀些特定字符会有特殊的含义。
where条件后接MATCH(column_name1,column_name2) AGAINST('keyword'IN BOOLEAN MODE)
BOOLEAN 模式操作符使⽤说明
符号功能描述
+符号后⾯接的单词必须要在搜索结果⾥
-符号后⾯接的单词必须不能出现在搜索结果⾥
<;符号后⾯接的单词匹配优先级低⼀些
外汇百科>符号后⾯接的单词匹配优先级⾼⼀些
()⽤于匹配表达式中的⼀组单词
~可选,相关性级别低的词,匹配后排名会相对靠后
*通配符,跟在词的后⾯,进⾏模糊检索
"双引号间的内容进⾏全词匹配(引号间的内容不会被分词),适合短语和⼦句的匹配,遵循最左匹配原则
符号功能描述
布尔全⽂搜索⽰例
eg1. MATCH(food_name) AGAINST(’+apple-orange’) 可以匹配出 包含apple,apples,Apples 等单词,并不包含orange、oranges、Oranges等单词的记录
eg2.MATCH(food_name) AGAINST(’“apple orange”’) 可以匹配出 包含apple-orange字句的记录
3.3 多列索引和单列索引
对于普通的索引,如果建⽴了(column_name1,column_name2)的联合索引,就不必单独建⽴ column_name1和 column_name2的索引,也可以搜索单列。但是全⽂索引就不⾏,索引的列必须和查询的列完全⼀致。如果查询 column_name1,就要建⽴column_name1单列的全⽂索引;如果查询 (column_name1, column_name2) 就要建⽴只包含 (column_name1,
column_name2) 两列的索引。
4、全⽂索引如何⽀持中⽂分词
MySQL需要开启ngram插件青潮
MySQL 5.7开始,MySQL内置了ngram全⽂检索插件
使⽤索引
alter table table1 add fulltext index idx_ft_test(clumn1,clumn2)with parser ngram;
当然也可以在建表时指定索引
CREATE TABLE table1(
id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(200),
love_foodsTEXT,
FULLTEXT key(name,love_foods)WITH PARSER ngram
)ENGINE=InnoDB CHARACTER SET utf8mb4;
MariaDB创建表时指定使⽤mroonga存储引擎即可
create table table1 (
id int not null,
name varchar(100)not null,
love_foods text,
fulltext key idx_ft_love_foods(love_foods)
)engine=mroonga;
5、全⽂索引使⽤⽰例,以MariaDB为例
5.1 创建表和索引
CREATE TABLE ft_myisam(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;
INSERT INTO ft_myisam(copy) VALUES ('Once upon a time'),
('There was a wicked witch'), ('Who ate everybody up');
SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked');
+--------------------------+
| copy                    |
+--------------------------+
| There was a wicked witch |
+--------------------------+
多个单词的情况:
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked,witch');
+---------------------------------+
| copy                            |
+---------------------------------+
| There was a wicked witch        |
刘湖+---------------------------------+
如果关键字未到,则返回空
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('Once');
Empty set(0.00 sec)
如果匹配了超过50%的记录,返回空
INSERT INTO ft_myisam(copy)VALUES('Once upon a wicked time'),
('There was a wicked wicked witch'),('Who ate everybody wicked up');
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked');
Empty set(0.00 sec)
5.2 使⽤IN BOOLEAN MODE模式来解决满⾜条件的记录占⽐超过50%的情况
SELECT*FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked'IN BOOLEAN MODE); +---------------------------------+
| copy                            |
+---------------------------------+
| There was a wicked witch        |
| Once upon a wicked time|
| There was a wicked wicked witch |
| Who ate everybody wicked up    |
+---------------------------------+
返回了如下结果:
SELECT copy,MATCH(copy) AGAINST('witch')AS relevance
FROM ft_myisam WHERE MATCH(copy) AGAINST('witch');
+---------------------------------+--------------------+
| copy                            | relevance          |
+---------------------------------+--------------------+
| There was a wicked witch        |0.6775632500648499|
| There was a wicked wicked witch |0.5031757950782776|
+---------------------------------+--------------------+
5.3 IN BOOLEAN MODE模式的操作符使⽤说明与⽰例

本文发布于:2024-09-20 15:39:33,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/479796.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:单词   分词   默认   匹配   数据库   查询   搜索   检索
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议