Mysql使用全文索引(FullText index)的实例代码


Posted in MySQL onApril 03, 2022

什么是全文索引

全文索引,通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题. 例如: 有title字段,需要查询所有包含 "政府"的记录. 需要 like "%政府%"方式查询,查询速度慢,当查询包含"政府" OR "中国"的需要是,sql难以简单满足.全文索引就可以实现这个功能.

倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

注意

在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词.

创建全文索引

  • 创建表的时候创建
CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR (200),
    body TEXT,
    FULLTEXT (title, body) WITH PARSER ngram
) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';

创建了一个给title和body字段添加全文缩影的表

  • 给字段添加全文索引 ALTER TABLE articles ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;

使用全文索引

MySQL的全文索引查询有多种模式

自然语言搜索

普通的判断是否包含

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神' IN NATURAL LANGUAGE MODE);
+----+-----------------+-------------------------+
| id | title           | body                    |
+----+-----------------+-------------------------+
|  1 | 弘扬正能量      | 贯彻党的18大精神        |
+----+-----------------+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神');
+----+-----------------+-------------------------+
| id | title           | body                    |
+----+-----------------+-------------------------+
|  1 | 弘扬正能量      | 贯彻党的18大精神        |
+----+-----------------+-------------------------+
1 row in set (0.00 sec)
可以看到,搜索结果命中了一条,且在不指定搜索模式的情况下,默认模式为自然语言搜索.

BOOLEAN MODE

这个模式和lucene中的BooleanQuery很像,可以通过一些操作符,来指定搜索词在结果中的包含情况.比如 + 表示必须包含 , -表示必须不包含,默认为误操作符,代表可以出现可以不出现,但是出现时在查询结果集中的排名较高一些.也就是该结果和搜索词的相关性高一些.

具体包含的所有操作符可以通过MySQL查询来查看:

show variables like '%ft_boolean_syntax%'

+-------------------+----------------+
| Variable_name     | Value          |
+-------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
+-------------------+----------------+
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+精神' IN BOOLEAN MODE);
+----+-----------------+-------------------------+
| id | title           | body                    |
+----+-----------------+-------------------------+
|  1 | 弘扬正能量      | 贯彻党的18大精神        |
+----+-----------------+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+精神 -贯彻' IN BOOLEAN MODE);
Empty set (0.01 sec)
当搜索必须命中精神时,命中了一条数据,当在加上不能包含贯彻的时候,无命中结果.

强烈注意:MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。

注:目前,使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。

注:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。

总结

到此这篇关于Mysql使用全文索引(FullText index)的文章就介绍到这了,更多相关Mysql使用全文索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
修改MySQL的默认密码的四种小方法
May 26 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
MySql子查询IN的执行和优化的实现
Aug 02 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
详解MySQL的内连接和外连接
May 08 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
PHP使用递归生成文章树
2015/04/21 PHP
php实现的RSS生成类实例
2015/04/23 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
初学Javascript的一些总结
2008/11/03 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
跟老齐学Python之有点简约的元组
2014/09/24 Python
深入理解python多进程编程
2016/06/12 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
python的依赖管理的实现
2019/05/14 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
vscode调试django项目的方法
2020/08/06 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
《乡下孩子》教学反思
2014/04/17 职场文书
设计顾问服务计划书
2014/05/04 职场文书
领导班子对照检查材料
2014/09/22 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书