MySQL 之全文索引--fulltext

https://blog.csdn.net/mrzhouxiaofei/article/details/79940958

通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。
like + % 在文本比较少时是合适的,全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

1、创建表的时候创建索引

// 创建全文索引
CREATE TABLE table (
	id INT(11) NOT NULL AUTO_INCREMENT,
	content TEXT NOT NULL,
	tag VARCHAR(255) NULL DEFAULT NULL,
	PRIMARY KEY (id),
	FULLTEXT INDEX contentft (content)
)

当查询多列数据时:,要在多列数据上创建一个联合的全文索引

// 创建 联合全文索引
CREATE TABLE table_b (
	id INT(11) NOT NULL AUTO_INCREMENT,
	content TEXT NOT NULL,
	tag VARCHAR(255) NULL DEFAULT NULL,
	PRIMARY KEY (id),
	FULLTEXT INDEX content_tag_fulltext (content, tag)
)

2、在已存在的表上创建索引

CREATE TABLE table_c (
	id INT(11) NOT NULL AUTO_INCREMENT,
	content TEXT NOT NULL,
	tag VARCHAR(255) NULL DEFAULT NULL,
	PRIMARY KEY (id)
)1CREATE FULLTEXT INDEX fulltext_tag ON table_c(tag)2ALTER TABLE table_c ADD FULLTEXT INDEX fulltext_tag(tag)


3、删除索引

1DROP INDEX fulltext_tag ON table_c
(2ALTER TABLE table_c DROP INDEX fulltext_tag

4、查询

全文索引

SELECT * FROM table_a WHERE MATCH(content) AGAINST('aa')

查询不到结果,

SELECT * FROM table_a WHERE MATCH(content) AGAINST('aaa')

查询的到结果

最小搜索长度,最大搜索长度

SHOW VARIABLES LIKE '%ft%'

MyISAM
在这里插入图片描述
在这里插入图片描述

可以进行修改,
在 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下内容:
[mysqld]
innodb_ft_min_token_size = 1
ft_min_word_len = 1
然后重启 MySQL 服务器,并修复全文索引。不然参数不会生效。
两种修复方式,可以使用下面的命令修复

REPAIR TABLE table_a QUICK 

或者直接删掉重新建立索引
联合全文索引查询

SELECT * FROM table_b WHERE MATCH(content,tag) AGAINST ('aa aaa')

无效词(停止词)50%的门坎限制

stopword
在全文索引中,如果一个词被认为是太普通或者太没价值,那么它将会被搜索索引和搜索查询忽略。innodb和myisam分别有两组不同的设置,控制着对应的stopword。
使用IN BOOLEAN MODE可避开50%的限制

自然语言的全文索引

在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过 50% 的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。

布尔全文索引

  • 必须包含该词
  • 必须不包含该词,不能只用「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。
    MATCH (girl_name) AGAINST (‘-林志玲 +张筱雨’)
    匹配到: 所有不包含林志玲,但包含张筱雨的记录

提高该词的相关性,查询的结果靠前
< 降低该词的相关性,查询的结果靠后
(*)星号 通配符,只能接在词后面

SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪' IN BOOLEAN MODE)SELECT * FROM student WHERE MATCH(name) AGAINST('王*' in BOOLEAN MODE)

C:\Windows\System32\cmd.exe
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
innodb_ft_min_token_size = 1
ft_min_word_len = 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL全文索引Full-Text Index)是一种特殊的索引类型,用于实现在文本数据中进行全文搜索的功能。它支持关键字搜索、模糊搜索、布尔搜索等操作,对于包含大量文本内容的表格非常有用。 要创建全文索引,需要使用FULLTEXT关键字在表的某个列上创建索引。例如,假设有一个名为`content`的列,我们可以在该列上创建全文索引,如下所示: ```sql CREATE FULLTEXT INDEX index_name ON table_name (content); ``` 这样就在`table_name`表的`content`列上创建了名为`index_name`的全文索引。 一旦创建了全文索引,在查询时可以使用MATCH AGAINST语句来进行全文搜索。例如,要搜索包含特定关键字的行,可以使用以下查询语句: ```sql SELECT * FROM table_name WHERE MATCH (content) AGAINST ('keyword'); ``` 其中,`table_name`是表名,`content`是包含全文索引的列名,`keyword`是要搜索的关键字。 除了简单的关键字搜索,全文索引还支持更高级的功能,如布尔搜索、模糊搜索、排序等。可以根据具体的需求和语法规则来进行更复杂的全文搜索操作。 需要注意的是,全文索引只能在特定的存储引擎下使用,如MyISAM和InnoDB。另外,全文索引对于较大的表格和复杂的查询可能会影响性能,因此在使用全文索引时需要进行权衡和优化。 希望以上解答对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值