MySQL全文检索初探
mysql 初探 全文检索
2023-09-11 14:13:56 时间
本文目的
最近有个项目需要对数据进行搜索功能。采用的LAMP技术开发,所以自然想到了MySQL的全文检索功能。现在将自己搜集的一些资料小结,作为备忘。
MySQL引擎
据目前查到的资料,只有MyISAM引擎支持全文检索(full text index),查询效率高。但是有局限,不支持事务和外键。
Innodb支持事务和外键,但是不支持全文检索。所以,如果需要全文检索的数据,需要使用MyISAM引擎创建表。
MySQL中文全文检索
很遗憾,目前mysql不支持中文全文检索。目前有两种解决方案
- 方案1:使用mysql中文检索插件,个人认为可控性较差,虽然使用方便,但是如果后期插件出现问题,比较难解决。优点就是前期工作量相对较小。
- 方案2:中文分词+GB2312编码:通过分词将原文分隔开,然后转成GB2312的二进制文本形式(如一个字,4个字节A623,这样就可以搜索单个中文)。(转成GB2312编码是为了避免中英文混合搜索。mysql全文检索最小长度默认4(ft_min_word_len)个字,中文是4个汉字,英文是4个字母。对于中文,基本上都是2子词,所以设置ft_min_word_len为2,但英文中,2字的单词一般没有什么特殊意义,如‘is’,‘do’等,所以为了兼顾中英文语法习惯,将中文适当‘变长’,也就是转成GB2312的可见形式编码)
- 方案3:中文分词,ft_min_word_len设置为2,调用'repair table your_table quick',修复索引。相比方案2,此方案较节省空间。对于主要使用中文的系统而言,此方案更佳。
创建全文索引
举一个文章表(t_article)的例子,title和body作为列子,如下:
CREATE TABLE `t_article` ( `title` varchar(100) DEFAULT NULL, `body` text, FULLTEXT KEY `ft_title` (`title`), FULLTEXT KEY `ft_body` (`body`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
P.S.: 如果有个表已经创建了全文索引,想要查看创建语法,可以使用“SHOW CREATE TABLE talbe_name;”这条命令显示表格的创建语句。
注意红色高亮部分就是全文检索的语法。删除也很简单,比如删除title的全文索引,“ALTER TABLE t_article DROP INDEX ft_title;”。
使用SQL检索
比如期望对body中的数据进行全文检索,命令如下
SELECT title, MATCH(body) AGAINST('php and other key word') AS score FROM t_article WHERE MATCH(body) AGAINST('php and other key word');
注意这里的score很重要,该值代表了关键字与文本的相关性,该值一般在0到1之间,但是也可能达到4或更多。
相关资料
- Using MySQL Full-text Searching
- How to drop this index in MySQL?
- 支持中文的MYSQL全文检索
- MySQL Fulltext Search 使用方式
- Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL?(PS: 个人理解全文检索技术产品中,mysql轻量级,sphinx中量级,Lucence重量级)
- 通过MySQL全文搜索实现中文的相关搜索(PS: 讲解了为什么需要将中文分词后转码,作为全文检索)
- 如何设置ft_min_word_len参数:http://www.tipandtrick.net/2008/how-to-change-mysql-fulltext-index-minimum-and-maximum-length-of-words/
转自:http://www.cnblogs.com/bourneli/archive/2012/08/09/2630753.html
相关文章
- Python——MySQL操作,使用mysql.connector
- Mysql授权允许远程访问解决Navicat for MySQL连接mysql提示客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端
- 【Mysql 学习】mysql 字符集
- 【MySQL】一次修改mysql 默认路径的经历
- 用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- MySQL锁详解
- connection to dat Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- mysql中tinyint、smallint、int、bigint的区别
- 【备份】使用mysqldump 实现rename database name(mysql数据库改名称)
- MySQL · 社区动态 · MariaDB Role 体系
- [转]2006 MySQL server has gone away错误,最大值溢出解决办法 mysql max_allowed_packet 查询和修改
- mysql标准规范
- Python:mysql-connector-python模块对MySQL数据库进行增删改查
- Node.js:knex.js数据库MySQL query builder
- mysql事务 mysql事务回滚 MySQL事务死锁 如何解除死锁 资金出入账
- Linux MySQl 5.7.17 MySQL ERROR 1366(HY000):Incorrect string value 解决方法
- MySQL----MySQL数据库忘记root用户登录密码的解决办法
- MySQL添加多个字段
- Mysql报错:Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- 程序报错`com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure`
- Shell脚本之一键安装mysql
- Mysql之修改mysql的视图定义者
- Shell脚本一键安装-----MYSQL数据库
- s22.Mysql数据库基于二进制包一键安装脚本
- 云原生系列之使用 prometheus监控MySQL实战
- mysql卸载
- MySQL 查看所有事件详细情况