内容简介:Elasticsearch 是全文搜索的首选,但是对于资金没有那么充足,或者数据量没有那么多的团队,MySQL 提供的全文搜索已经可以满足需求。MySQL 的全文搜索默认不支持中文,如果要支持中文,要在配置里加入这个时候 MySQL 可以搜索至少两个字的关键词,1个字还是不能搜索的。然后在建索引的时候要设置 WITH PARSER ngram
Elasticsearch 是全文搜索的首选,但是对于资金没有那么充足,或者数据量没有那么多的团队,MySQL 提供的全文搜索已经可以满足需求。
MySQL 的全文搜索默认不支持中文,如果要支持中文,要在配置里加入
[mysqld] ngram_token_size=2
这个时候 MySQL 可以搜索至少两个字的关键词,1个字还是不能搜索的。然后在建索引的时候要设置 WITH PARSER ngram
mysql> USE test; mysql> 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 CHARACTER SET utf8mb4; mysql> SET NAMES utf8mb4; INSERT INTO articles (title,body) VALUES ('数据库管理','在本教程中我将向你展示如何管理数据库'), ('数据库应用开发','学习开发数据库应用程序');
对于已存在的表,这样建立索引
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT ) ENGINE=InnoDB CHARACTER SET utf8; ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram; # Or: CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;
现在可以这样搜索
SELECT * FROM articles WHERE MATCH(title,body) AGAINST('数据库教程');
注意这里不管是索引还是关键词“数据库教程”,我都没有做分词,MySQL都自动处理了。
高级
IN NATURAL LANGUAGE MODE
默认的搜索方式是 IN NATURAL LANGUAGE MODE,即全部匹配关键词,使用如下
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 5 | MySQL vs. YourSQL | In the following database comparison ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec)
即使不加 IN NATURAL LANGUAGE MODE 也是这个结果
IN BOOLEAN MODE
BOOLEAN MODE 提供高级搜索方法,使用如下
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); +----+-----------------------+-------------------------------------+ | id | title | body | +----+-----------------------+-------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 2 | How To Use MySQL Well | After you went through a ... | | 3 | Optimizing MySQL | In this tutorial we will show ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | | 6 | MySQL Security | When configured properly, MySQL ... | +----+-----------------------+-------------------------------------+
这里关键词里面的
- +表示必须有
- -表示必须没有
- 不加符号表示可有可没有
- @表示距离,即关键词必须在某距离内,例如 MATCH(col1) AGAINST(‘“word1 word2 word3” @8’ IN BOOLEAN MODE)
- < > 这两个符号表示关键词权重,> 提升权重,< 降低权重
- ( ) 表示表达式优先级
- ~ 表示关键词可以没有,如果有,则降低权重
- *匹配以关键词开始的词(见下面例子)
- “ 匹配完整的词
例子:
-
‘apple banana’
包含至少一个词
-
‘+apple + juice’
必须包含两个词
-
‘+apple macintosh’
包含”apple”,如果也包含“macintosh”则提高优先级
-
‘+apple -macintosh’
包含’apple’但是不能包含 ‘macintosh’
-
‘+apple ~macintosh’
包含’apple’,如果也包含’macintosh’,则降低优先级
-
‘+apple +(>turnover <strudel)’
包含 ‘apple’ 和 ‘turnover’,或者 ‘apple’ 和 ‘strudel’(顺序不限),前者比后者优先级高
-
‘apple*’
匹配所有’apple’开头的词,如’apples’,’applesauce’,或’applet’
-
‘“some words”‘
匹配完整的词,例如匹配”some words of wisdom”,但不匹配”some noise words”
最佳实践
- 如果索引是 (title,body),则不能只搜索 title 或 body
- 有时候我们要去掉表里的某一行,不是删除,而是做一个标记,例如 isDeleted。由于全文索引是单独的索引,不能同时包含 isDeleted 列,所以数据量大的话,建议单独建表来存放,而不是在原表上建立索引
参考资料:
MySQL中文支持设置 https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html
BOOLEAN MODE https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
以上所述就是小编给大家介绍的《mysql中文全文搜索》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 全文搜索-ElasticSearch
- Elasticsearch构建全文搜索系统
- ElasticSearch全文搜索引擎
- ElasticSearch--分布式全文搜索框架
- 12.Laravel全文搜索Elasticsearch (三)
- 全文搜索引擎 Elasticsearch 入门教程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据化运营速成手册
胡晨川 / 电子工业出版社 / 2017-4 / 55
《数据化运营速成手册》用于提升互联网公司员工的数据应用能力,即数据化运营能力。首先,从最常用的数据图表切入,帮助执行层正确地绘图,管理层正确地看图;接着,梳理运营中最基本的数据应用知识,涉及数据获取、数据清洗、数据认知、分析框架、指标体系、运营实验等内容。然后,介绍作者认为必要的统计学知识,包括假设检验、方差分析、回归分析和时间序列分解,并引入了管理科学中的规划求解方法。最后,介绍了数据分析工具的......一起来看看 《数据化运营速成手册》 这本书的介绍吧!