在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
本文使用的MySQL 版本是5.7.25,InnoDB数据库引擎。

1. 创建带全文索引的表

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;

2. 通过 alter table 的方式来添加

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

3. 直接通过create index的方式

CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;

4. 添加数据

INSERT INTO `articles` VALUES ('2', '文章标题', '内容正文');

5. 执行查询

mysql> SELECT id,title,body,
MATCH (title,body) AGAINST ('标题' IN NATURAL LANGUAGE MODE) AS score
FROM articles where MATCH (title,body) AGAINST ('标题' IN NATURAL LANGUAGE MODE)
ORDER BY score DESC;
+----+----------+----------+--------------------+
| id | title    | body     | score              |
+----+----------+----------+--------------------+
|  2 | 文章标题 | 内容正文 | 0.0906190574169159 |
+----+----------+----------+--------------------+
1 row in setmysql> SELECT id,title,body,
MATCH (title,body) AGAINST ('内容' IN NATURAL LANGUAGE MODE) AS score
FROM articles where MATCH (title,body) AGAINST ('内容' IN NATURAL LANGUAGE MODE)
ORDER BY score DESC;
+----+----------+----------+--------------------+
| id | title    | body     | score              |
+----+----------+----------+--------------------+
|  2 | 文章标题 | 内容正文 | 0.0906190574169159 |
+----+----------+----------+--------------------+
1 row in setmysql> SELECT id,title,body,
MATCH (title,body) AGAINST ('机会' IN NATURAL LANGUAGE MODE) AS score
FROM articles where MATCH (title,body) AGAINST ('机会' IN NATURAL LANGUAGE MODE)
ORDER BY score DESC;
Empty set

常用的全文检索模式有两种:
1、自然语言模式(NATURAL LANGUAGE MODE) ,
自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。
2、BOOLEAN模式(BOOLEAN MODE)
BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。

SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);// 不指定模式,默认使用自然语言模式
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带');

可以使用BOOLEAN模式执行高级查询。

// 必须包含"腾讯"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+腾讯' IN BOOLEAN MODE);

BOOLEAN模式下运算符的使用方式:


'apple banana'
无操作符,表示或,要么包含apple,要么包含banana'+apple +juice'
必须同时包含两个词'+apple macintosh'
必须包含apple,但是如果也包含macintosh的话,相关性会更高。'+apple -macintosh'
必须包含apple,同时不能包含macintosh。'+apple ~macintosh'
必须包含apple,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。'+apple +(>juice <pie)'
查询必须包含apple和juice或者apple和pie的记录,但是apple juice的相关性要比apple pie高。'apple*'
查询包含以apple开头的单词的记录,如apple、apples、applet。'"some words"'
使用双引号把要搜素的词括起来,效果类似于like '%some words%',
例如“some words of wisdom”会被匹配到,而“some noise words”就不会被匹配。
  • 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。
  • 全文索引只支持InnoDB和MyISAM引擎。
  • MATCH (columnName) AGAINST ('keywords')。MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致。如上面的示例,MATCH (title,body)使用的字段名与全文索引ft_articles(title,body)定义的字段名一致。如果要对title或者body字段分别进行查询,就需要在title和body字段上分别创建新的全文索引。
  • MATCH()函数使用的字段名只能是同一个表的字段,因为全文索引不能够跨多个表进行检索。
  • 如果要导入大数据集,使用先导入数据再在表上创建全文索引的方式要比先在表上创建全文索引再导入数据的方式快很多,所以全文索引是很影响TPS的。

mysql 5.7.25 中文全文检索(多个字段联合索引)相关推荐

  1. mysql 5.7 刘,深度解析MySQL 5.7之中文全文检索

    前言 其实全文检索在mysql里面很早就支持了,只不过一直以来只支持英文.缘由是他从来都使用空格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词.这不,从mysql 5 ...

  2. mysql 非等值条件 索引_mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦...

    以前学习这一块的时候,是说:假设建立了联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引. 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化. 下面是我 ...

  3. MySQL联合索引原理解析

    什么是MySQL联合索引 联合索引又叫复合索引,是MySQL的InnoDB引擎中的一个索引方式,如果一个系统频繁地使用相同的几个字段查询结果,就可以考虑建立这几个字段的联合索引来提高查询效率. 如何建 ...

  4. MySQL中文全文检索

    一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 1 2 MATCH (col1,col2,...) AGAINST (exp ...

  5. mysql sphinx windows安装_Sphinx在windows下安装使用[支持中文全文检索]

    前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在 linux环境下的安装使用,当然,作为生产环境很有必要部署在 ...

  6. php mysql 全文检索_MySQL中文全文检索

    一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 MATCH (col1,col2,...) AGAINST (expr [s ...

  7. MySQL中文全文检索demoSQL

    一.概述       MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法       MATCH (col1,col2,...) AGAI ...

  8. mysql中文全文检索从入门到放弃

    like全匹配模糊查询不能使用索引一直是sql查询的一个棘手的问题,那么mysql的全文检索真的能解决这个问题吗? 背景 最近,在工作中遇到一个查询优化的问题,简化的sql如下: SELECT* FR ...

  9. mysql5.7中文全文检索,让MySQL支持中文全文检索

    因为中文词间并没有明显的区隔,所以中文的分词是按照字典.词库的匹配和词的频度统计,或是基于句法.语法分析的分词,而MySQL并不具备此功能,所以MySQL对中文全文检索的支持几乎为零. 目前很多网站和 ...

  10. pdm 导入mysql 注释_PowerDesigner逆向导入MYSQL数据库并显示中文注释(转载)

    我想直观的查看数据库表之间的关系与中文注释,发现Navicat Premium下的表模型功能,并没有注释功能: 用起来不是很方便.所有想到了用PowerDesigner来逆向MYSQL中的表,并显示中 ...

最新文章

  1. pat天梯赛练习 L2-006
  2. 整理 | 软件与工具的收集汇总及推荐
  3. 第三方软件要使用QQ邮箱进行发邮件相关设置
  4. matlab 文件指针回到开头,[c/c++] 文件指针位置回到文件开头(rewind)及行开头(ftell+fseek)...
  5. 带通滤波器作用和用途_带通滤波器作用
  6. 我的Go+语言初体验——(7)Go+ 分数型有理数数据类型
  7. HPU 1002 A + B Problem II【大数】
  8. PHP mysql_real_escape_string() 函数防止数据库攻击
  9. php gbk json,GBK的页面输出JSON格式的php函数
  10. Qt5学习笔记之QQ登录界面二:登录按钮与信号槽
  11. ccs安装多版本编译器离线_CCS编译器安装,DSP/BIOS安装
  12. 190322每日一句
  13. Gifxing在线图片无损压缩,gif压缩
  14. 快速批量创建文件夹、文件的快捷键
  15. anaconda使用jupyter
  16. 关于Opencv 分水岭算法种子点(注水口)的选取问题
  17. 关于ViewGroup和View的事件分发
  18. php360随机壁纸图片接口,PHP超简单的随机图片头像API接口网站搭建教程
  19. 用 Python 一键生成QQ个人报告
  20. php更改导航栏图标,wordpress导航菜单前添加矢量小图标

热门文章

  1. php+uc+client_uc_client是如何与UCenter进行通信的
  2. C4D的几大主流渲染器!看完你就知道选择学习哪款了
  3. Windows组策略禁止广告弹窗
  4. 国债(长短期)、财政赤字、利率、美元指数、国债收益率关系
  5. 文件内容批量简体转换繁体
  6. java 地铁线路_个人项目-地铁出行路线规划(Java代码实现)
  7. android google翻译,在android中施用google翻译
  8. 项目市场调查报告的撰写要则
  9. 2020年度十大高薪岗位出炉!程序员霸榜!
  10. 常见的Socket技术-----伤痛