最全面的mysql索引详解(MySQL 全文索引使用指南)
最全面的mysql索引详解
MySQL 全文索引使用指南全文索引需要特殊的查询语法。有没有索引都可以进行全文检索,但是存在索引时会提高匹配的速度。全文索引的索引通过特殊的结构存储以便于找到文档中包含搜索关键字对应的内容。在我们日常生活中,最常见的全文检索就是网络搜索引擎。虽然,网络搜索引擎的数据里十分庞大,并且通常也不会使用关系型数据库,但是原理是相似的。
全文索引支持通过基于字符(CHAR、VARCHAR 和 TEXT 类型的列)的检索,也可以支持自然语言模式(Natural Language Mode, 默认)和布尔模式 (Boolean Mode)。例如我们搜索“数据库引擎”的时候,内容中包括“数据库”、“引擎”和“数据库引擎”的内容都会检索出来。全文索引的实现有大量的限制,而且十分复杂。但是由于内置在MySQL服务端,而且对很多应用都能够满足要求,因此被广泛使用。
在MySQL5.6之前的版本中,只有 MyISAM 存储引擎支持全文索引。创建全文索引需要指定列标记为全文索引,如下面的 content 列。
|
CREATE TABLE t_news ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY , content TEXT, author VARCHAR (32), title VARCHAR (128), FULLTEXT (content) ) ENGINE=InnoDB; |
MySQL 5.6以前对中文搜索支持不是太好,需要自己进行分词后将段落预处理拆分成单词在入库。MySQL5.7.6后才有了内置的分词器 ngram。ngram 支持设置设置分词的长度,可以将中文按长度拆分为不同的单词(虽然不太智能,但满足大部分场景)。可以通过 MySQL 的全局变量ngram_token_size设置分词长度,默认是2,支持1-10可选。对于上面的例子,需要指定分词器构建全文索引。
|
CREATE TABLE t_news ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY , content TEXT, author VARCHAR (32), title VARCHAR (128), FULLTEXT KEY idx(content) WITH PARSER ngram ) ENGINE=InnoDB; |
插入一条数据测试。
|
INSERT INTO `t_news` (`id`, `content`, `author`, `title`) VALUES ( '1' , '我有一个数据库和引擎' , '岛上码农' , '数据库引擎' ); |
在简单的模糊搜索中可以使用 LIKE 来完成,而对于全文检索需要使用如下方式的语句:
|
SELECT * FROM t_news WHERE MATCH (content) AGAINST ( '数据 引擎' IN NATURAL LANGUAGE MODE) |
通过这种方式可以检索出刚刚插入的内容,而如果使用 LIKE 是没法完成的。也支持使用相关性排序,再插入一条数据:
|
INSERT INTO `t_news` (`id`, `content`, `author`, `title`) VALUES (2, '我有一个数据库' , '岛上码农' , '数据库' ) |
然后执行排序查询:
|
SELECT *, MATCH (content) AGAINST ( '数据 引擎' ) AS relevance FROM t_news WHERE MATCH (content) AGAINST ( '数据 引擎' ) ORDER BY relevance ASC |
这里将匹配值作为一列查询,以便使用其别名进行排序。相关性越高,对应的 relevance 值越大,因此可以用作排序。入股不相关,那么 relevance 的值为0。
布尔模式可以做更多的控制,例如包括使用+号保留匹配结果和使用-号排除匹配结果,下面的就匹配了数据,而排除了包含引擎的数据。更多操作符可以参考 MySQL 的官方文档:全文索引操作符。
|
SELECT * FROM t_news WHERE MATCH (content) AGAINST ( '+数据* -引擎' IN BOOLEAN MODE); |
以上就是MySQL 全文索引使用指南的详细内容,更多关于MySQL 全文索引的资料请关注开心学习网其它相关文章!
原文链接:https://juejin.cn/post/6965859375734849567
- netcore连什么数据库好(.Net Core导入千万级数据至Mysql的步骤)
- mysql标签的用法(mysql 的indexof函数用法说明)
- mysqldump 命令详解(mysqldump你可能不知道的参数)
- mysql各种备份方式(MySQL 逻辑备份与恢复测试的相关总结)
- mysql快速添加百万条记录(Mysql快速插入千万条数据的实战教程)
- mysql char和varchar区别(MySQL CHAR和VARCHAR存储、读取时的差别)
- mysql修改表内字段的数据类型(mysql修改记录时update操作 字段=字段+字符串)
- mysql拼接多字段作为查询条件(Mysql 实现字段拼接的三个函数)
- MySQL定时任务(EVENT事件)如何配置详解(MySQL定时任务EVENT事件如何配置详解)
- MySQL配置文件my.cnf的介绍
- mysql如何删除整个表及数据(Mysql删除数据以及数据表的方法实例)
- mysql主键什么情况用uuid(Mysql主键UUID和自增主键的区别及优劣分析)
- mysql字段和关键字(mySQL之关键字的执行优先级讲解)
- mysql安装时服务无法启动(MySQL 实例无法启动的问题分析及解决)
- mysql在centos7中如何安装(阿里云centos7安装mysql8.0.22的详细教程)
- mysql查询时间格式化(MySQL时间格式化)
- 《无敌破坏王2》 不聊彩蛋,聊聊我从动画里看到的现实那些事儿(无敌破坏王2不聊彩蛋)
- 《寄生虫》 三观不正 人类悲欢从来不相通,感同身受也并非本能(寄生虫三观不正)
- 这部动漫中的女孩子,可比101女孩更加励志(这部动漫中的女孩子)
- 《白狐的人生》热拍 贾征宇偶像包袱难自弃 图(白狐的人生热拍)
- 七夕取消了,牛郎织女没做核酸七夕已经取消(牛郎织女没做核酸七夕已经取消)
- 网友抵制 多地取消 夏日祭 为何惹众怒(网友抵制多地取消)
热门推荐
- html5怎么滚动屏幕(HTML5 video进入全屏和退出全屏的实现方法)
- dede图片上传问题(DEDE图片集上传图片时出错显示FILEID的解决方法)
- react native web白屏(关于React Native 无法链接模拟器的问题)
- char、nchar、varchar、nvarchar、text、ntext的区别
- react 使用实例(React+高德地图实时获取经纬度,定位地址)
- sqlserver复制表结构及数据到新表(SQL SERVER 表与表之间 字段一对多sql语句写法)
- python常用的切片操作(使用python PIL库实现简单验证码的去噪方法步骤)
- reactredux任务处理进度(一文搞懂redux在react中的初步用法)
- sqlserver 怎么排序(SQLserver排序规则基本概念探索)
- angular教程第九讲(浅谈Angular的12个经典问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9