公司网站实用性,霞浦县网站seo优化排名,规划电子商务网站,新闻发布会筹备方案引言
在MySQL 5.7.6之前#xff0c;全文索引只支持英文全文索引#xff0c;不支持中文全文索引#xff0c;需要利用分词器把中文段落预处理拆分成单词#xff0c;然后存入数据库。 从MySQL 5.7.6开始#xff0c;MySQL内置了ngram全文解析器#xff0c;用来支持中文、日文…引言
在MySQL 5.7.6之前全文索引只支持英文全文索引不支持中文全文索引需要利用分词器把中文段落预处理拆分成单词然后存入数据库。 从MySQL 5.7.6开始MySQL内置了ngram全文解析器用来支持中文、日文、韩文分词。
一般的数据库搜索都是用的SQL的like语句like语句是不能利用索引的每次查询都是从第一条遍历至最后一条查询效率极其低下。一般数据超过10万或者在线人数过多like查询都会导致数据库崩溃。这也就是为什么很多程序都只提供标题搜索的原因了因为如果搜索内容那就更慢了几万数据就跑不动了。
Mysql 全文索引是专门为了解决模糊查询提供的可以对整篇文章预先按照词进行索引搜索效率高能够支持百万级的数据检索。
一、全文解析器ngram
ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词每个单词是连续的n个字的序列。 MySQL 中使用全局变量 ngram_token_size 来配置 ngram 中 n 的大小它的取值范围是1到10默认值是 2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字就要把ngram_token_size设置为 1。在默认值是 2 的情况下搜索单字是得不到任何结果的。因为中文单词最少是两个汉字推荐使用默认值 2。
查看Mysql默认的ngram_token_size大小
show variables like ngram_token_size;修改ngram_token_size 变量的两种设置方式
启动mysqld命令时指定:
mysqld --ngram_token_size2修改mysql配置文件:
[mysqld]
ngram_token_size2注意修改mysql的配置文件中的ngram_token_size大小需要重启数据库且如果之前建有全文索引需要删除重建因为更改 ngram_token_size 会影响索引的构建方式从而影响查询结果的准确性和性能。
二、全文索引
建表时创建全文索引
create table sys_basics_word
(id bigint(20) not null comment 主键,chinese varchar(255) comment 中文,thesaurus varchar(255) comment 同义词,chinese_meaning varchar(255) comment 中文含义,english_prototype varchar(255) comment 英文原型,abbr varchar(255) comment 缩写,reference varchar(255) comment 引用,chinese_and_thesaurus char(10) comment 中文和同义词,create_by varchar(100) comment 创建者,create_date datetime comment 创建时间,update_by varchar(100) comment 更新者,update_date datetime comment 更新时间,del_flag char(1) default 0 comment 删除标记,FULLTEXT KEY chinese_and_thesaurus (chinese_and_thesaurus) WITH PARSER ngram,primary key (id)
);通过 alter table 方式
ALTER TABLE sys_basics_word ADD FULLTEXT INDEX chinese_and_thesaurus(chinese_and_thesaurus) WITH PARSER ngram;通过 create index 方式
CREATE FULLTEXT INDEX chinese_and_thesaurusON sys_basics_word (chinese_and_thesaurus) WITH PARSER ngram;三、检索模式 自然语言检索IN NATURAL LANGUAGE MODE 自然语言模式是 MySQL 默认的全文检索模式。自然语言模式不能使用操作符不能指定关键词必须出现或者必须不能出现等复杂查询。 布尔检索IN BOOLEAN MODE 剔除一半匹配行以上都有的词例如每行都有this这个词的话那用this去查时会找不到任何结果这在记录条数特别多时很有用原因是数据库认为把所有行都找出来是没有意义的这时this几乎被当作是stopword(中断词)布尔检索模式可以使用操作符可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。
全文索引比 like % 快 N 倍但是可能存在精度问题 如果需要全文索引的是大量数据建议先添加数据再创建索引 MATCH()函数使用的字段名必须要与创建全文索引时指定的字段名一致且只能是同一个表的字段不能跨表。
参考文章 https://www.cnblogs.com/yuyanc/p/18134637 https://blog.csdn.net/weixin_44792849/article/details/123572516