mysql fulltext
mysql全文索引使用条件
首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持 英文的全文检索。
mysql全文索引使用条件有两个,一个是对表存储引擎类型的要求,二是对设置全文索引字段的类型的要求。
- 表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引)
- 字段类型:只有字段类型为char、varchar和text的字段才能设置全文索引。
mysql如何创建全文索引
全文索引可以在创建表的时候设置,也可以在已有的表中进行设置。
1.创建表时设置全文索引,具体代码如下:
CREATE TABLE IF NOT EXISTS `category` ( `id` int(10) NOT NULL auto_increment, `fid` int(10) NOT NULL, `catname` char(255) NOT NULL, `addtime` char(10) NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `catname` (`catname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
从上面代码可以看出,设置某字段为全文索引的SQL代码为FULLTEXT KEY `catname` (`catname`)
2.再已有的表中为某字段设置全文索引:
ALTER TABLE <table> ADD FULLTEXT (fields)
或者直接在myphpadmin控制台中点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同。
mysql全文索引的基本语法
全文索引搜索语法
MATCH (列名1, 列名2,…) AGAINST (搜索字符串 [搜索修饰符])
其中在match里面指定的列名1、2等,就是在建立全文索引中指定的列名, 后面的搜索修饰符说明如下:
search_modifier:
{
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
}
如:
SELECT * FROM tableName WHERE MATCH(fields) AGAINST ('search term')
mysql全文索引实例
首页我们建立表与初始化数据
CREATE TABLE IF NOT EXISTS `category` ( `id` int(10) NOT NULL auto_increment, `fid` int(10) NOT NULL, `catname` char(255) NOT NULL, `addtime` char(10) NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `catname` (`catname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; /* http://www.manongjc.com/article/1443.html */
INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES
(1, 0, 'welcome to you!', '1263363380'),
(2, 0, 'hello phpjs,you are welcome', '1263363416'),
(3, 0, 'this is the fan site of you', '1263363673');
在具体实例之前,我们分析下msyql全文检索的语法:函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。说白了就是MATCH给定匹配的列(fulltext类型索引),AGAINST给定要匹配的字符串,多 个用空格、标点分开,mysql会自动分隔。
操作一:
SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')
返回结果:
id | fid | catname | addtime |
2 | 0 | hello phpjs,you are welcome | 1263363416 |
匹配出了含有phpjs关键字的行数据。
操作二:
SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('this')
按照上面的思路,第三行数据含有this,因此应该可以匹配出第三行数据的,但事实却奇怪得很,返回结果为空,为什么呢?
原来是mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW VARIABLESLIKE 'ft_min_word_len' 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。
操作三:
这里我们要确定把最小字符改为2了,因为3行记录都有‘you’,因此心想,匹配‘you’就可以返回所有结果了
SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('you')
返回结果还是为空,大跌眼镜了吧,这又是为什么呢?
原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个 特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是 100%,只有低于50%的才会出现在结果集中。
操作四:
有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?
mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索
SELECT * FROM `category` WHERE MATCH(catname) AGAINST('you' IN BOOLEAN MODE)
总结:
- 要注意最小字符的长度;
- 要注意关键词的权重;
mysql中的like在有一些情况下是无法使用索引的,但是在数据量不是很大的时候效率也不低
先建立一张表:
-- 创建表
CREATE TABLE test(
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255),
PRIMARY KEY(id)
);
再在uname字段上创建索引:
-- 添加索引
ALTER TABLE test ADD INDEX uname_index (uname);-- 查看索引
SHOW INDEX FROM test;
![](https://img2018.cnblogs.com/blog/905539/201810/905539-20181010143352460-197551940.png)-- 添加记录
INSERT INTO test VALUES((1,'jay'),(2,'ja'),(3,'bril'),(4,'aybar');
检测结果:
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';
这么看来 %的使用对索引似乎没有印象,但是再加一个普通不是索引的字段
--添加一个非索引字段
ALTER TABLE `test`
ADD COLUMN `status` int(11) UNSIGNED NULL DEFAULT 1 AFTER `uname`
再次检测:
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';
EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';
EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';
这次的结果是: like后直接跟%号的匹配的查询不使用索引;like后先跟匹配值%,就会使用到索引。
----疑问???
|那么为啥加了一个字段后会有这样的区别呢?之前的字段是id,uname id是主键,也是索引的一部分 所以select * 取的两个字段都是索引字段。所以 like 语句都会使用到索引。
后面加了一个非索引字段status,并且取数据列表里也存在status字段,所以%在匹配值前的情况就会受影响。
当然如果不是select * ,而是select id 或者select uname 再或者 select id,uname 都会使用上索引。
mysql fulltext相关推荐
- mysql fulltext 分页_关于MySQL的FULLTEXT实现全文检索的注意事项
对于英文,MySQL的FULLTEXT属性来实现全文检索是相当方便且高效的,但是在使用过程中需要注意一些事项. 首先对我们对需要进行检索的字段添加FULLTEXT属性(假设已经建表): SQL: al ...
- mysql fulltext类型_mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的详细介绍(转)
Normal 普通索引 表示普通索引,大多数情况下都可以使用 Unique 唯一索引 表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique 约束唯一标识 ...
- mysql fulltext match_使用Mysql全文搜索Full-Text(fulltext和match...against)_MySQL
bitsCN.com 作者:aolinks 一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行, 但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候. ---- ...
- MySQL FULLTEXT全文索引
一.FULLTEXT简介 MySQL具备全文搜索的能力,它可以让你在不使用模板匹配操作的情况下进行单词或短语的查找. 全文搜索有3种类型: 自然语言搜索(默认类型).MySQL会把搜索字符串解析成一系 ...
- mysql fulltext innodb_InnoDB FULLTEXT
1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...
- mysql fulltext搜索_mysql 全文搜索 FULLTEXT
到 3.23.23 时,MySQL 开始支持全文索引和搜索.全文索引在 MySQL 中是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE ...
- mysql fulltext like_MySQL全文索引 FULLTEXT索引和like的区别
1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...
- mysql 索引 fulltext,MySQL FULLTEXT索引问题
I'm trying to create a FULLTEXT index on an attribute of a table. Mysql returns ERROR 1214: The used ...
- mysql fulltext 不起作用_MySQL FULLTEXT不工作
我正在尝试使用MySQL的FULLTEXT索引添加对我的PHP Web应用程序的搜索支持. 我创建了一个测试表(使用MyISAM类型,单个文本字段a)并输入了一些示例数据.现在如果我是正确的,以下查询 ...
最新文章
- 防止在iOS设备中的Safari将数字识别为电话号码
- adb logcat read: unexpected EOF!
- post postman 传值_postman参数传递
- 用SQL进行嵌套查询
- 这个Javascript“要求”是什么?
- mysql 范围索引 els_MySQL 复习笔记
- win10下Cmake(make-gui)下载与安装【详细】
- Python程序设计
- 小米手机TCP连接一些奇怪现象
- 浏览器和服务器的区别
- 将UTC日期字符串转为本地时间字符串,如@yyyy-MM-dd'T'HH:mm:ssZ转换为本地时间
- 2021Java面经:最便宜java培训机构
- SQL Server 配置管理器中Browser灰色无法启动解决办法
- 常用的自动化管理工具
- 细节!从solar winds黑客入侵事件中看供应链安全
- 小米官网前端页面还原
- 银河麒麟V10系统 syslog和kern.log文件过大问题解决,定时清理日志文件
- 你知道互联网行业哪些岗位需求量最大?什么职位最赚钱?
- 程序员必须掌握的英文单词(二)
- 安装工程造价课程设计_工程造价课程设计