Mysql建立中英文全文索引(mysql5.7以上)

2023-11-11

一、概念

        使用索引是数据库性能优化的必备技能之一。在MySQL数据库中,有四种索引:主键索引、普通索引、唯一索引以及我们这里将要介绍的全文索引(FUNLLTEXT INDEX)。 

        MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。

        全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。

二、Mysql全文索引版本限制

1.  MySQL5.6版本以下,只有MYISAM引擎表支持全文索引;mySQL5.6以上,Innodb引擎表也支持全文索引。

2.  因为Mysql使用空格作为分词的分隔符,所一直以来只支持英文的检索。但从MySQL5.7版本开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。

三、必要的参数设置

在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小(默认是2),比如:

[mysqld] 
ngram_token_size=2

分词的size越小,索引的体积越大,所以需要根据自身情况合理设计。(怎么才叫合理?后期实践后再更新。

四、相关的参数设置

ft_min_word_len = 4

这是全文检索的最小许可字符参数,默认4,通过 SHOW VARIABLES LIKE 'ft_min_word_len' 可查看,中文通常是两个字就是一个词,所以做中文的话需要修改这个值为2最好。


五、设置索引语法(设置数据库字段全文索引)

        在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(articles),其中有主键ID(id)、文章标题(title)、文章内容(content)三个字段。现在我们希望能够在title和content两个列上创建全文索引,article表及全文索引的创建SQL语句根据创建顺序分为两种方式,如下:

1.  建表时就开始建立全文索引:

CREATE TABLE articles ( 
  id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
  title VARCHAR(200), 
  content TEXT, 
  FULLTEXT (title,content) WITH PARSER ngram 
) ENGINE=InnoDB CHARACTER SET utf8mb4;

2. 先创建表,再添加完数据后,修改对应字段索引为全文索引

alter table articles add fulltext index testfulltext(title,content) with parser ngram; 

注意:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。

3.  直接创建索引

CREATE FULLTEXT INDEX index_content ON article(content)


六、全文检索语法

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

使用例子:

SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('词1 词2 词3 ... 词m');


七、查询方式

查询模式值:

search_modifier: { IN BOOLEAN MODE | IN NATURAL LANGUAGE MODE | WITH QUERY EXPANSION}

1.  自然语言检索:IN NATURAL LANGUAGE MODE

SELECT *,MATCH (title,content) AGAINST ('关键词' IN NATURAL LANGUAGE MODE) 
FROM articles WHERE MATCH (title,content) AGAINST ('关键词' IN NATURAL LANGUAGE MODE);


2.  布尔检索:IN BOOLEAN MODE

    2.1  概念:剔除一半匹配行以上都有的词。譬如说,每个行都有this这个字的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用,原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);但是若只有两行记录时,什么也查不出来的, 因为每个字都出现50%(或以上),要避免这种状况,请用IN BOOLEAN MODE。

    2.2 特点

     (1)不剔除50%以上符合的row。 
(2)不自动以相关性反向排序。 
(3)可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。 
(4)限制最长与最短的字符串。 

(5)套用Stopwords。

    2.3  搜索语法规则

        (1)+   :一定要有(不含有该关键词的数据条均被忽略)。 
        (2)-    :不可以有(排除指定关键词,含有该关键词的均被忽略)。 
        (3)>   :提高该条匹配数据的权重值。 
        (4)<   :降低该条匹配数据的权重值。
        (5)~   :将其相关性由正转负,表示拥有该字会降低相关性(但不像 - 将之排除),只是排在较后面权重值降低。 
        (6)*    :万用字,不像其他语法放在前面,这个要接在字符串后面。 

        (7)" " :用双引号将一段句子包起来表示要完全相符,不可拆字。

 举栗子

SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple -banana' IN BOOLEAN MODE);
说明:+ 表示AND,即必须包含。- 表示NOT,即必须不包含。即:返回记录必需包含 apple,且不能包含 banner。

SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('apple banana' IN BOOLEAN MODE);
说明:apple和banana之间是空格,空格表示OR。即:返回记录至少包含apple、banana中的一个。

SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple banana' IN BOOLEAN MODE);
说明:返回记录必须包含apple,同时banana可包含也可不包含,若包含的话会获得更高的权重。

SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple ~banana' IN BOOLEAN MODE);
说明: ~ 是我们熟悉的异或运算符。返回记录必须包含apple,若也包含了banana会降低权重。
      但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回。

SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);
说明:返回必须同时包含“apple banana”或者必须同时包含“apple orange”的记录。
      若同时包含“apple banana”和“apple orange”的记录,则“apple banana”的权重高于“apple orange”的权重。


3.  查询扩展检索: WITH QUERY EXPANSION


八、注意事项

1、预设搜寻是不分大小写,若要分大小写,columne(字段) 的 character(字符集) 设置要从utf8改成utf8_bin。

2、预设 MATCH...AGAINST 是以相关性排序,由高到低。

3、MATCH(title, content)里的字段必须和FULLTEXT(title, content)里的字段一模一样。如果只要单查title或content一个字段,那得另外再建一个 FULLTEXT(title) 或 FULLTEXT(content),也因为如此,MATCH()的字段一定不能跨table,但是另外两种搜寻方式好像可以。 


九、参考文档

1.  MySql5.7 InnoDB全文索引(针对中文搜索)

2.  MySQL中文全文检索

3.  MySQL创建全文索引

4.  MySQL 5.7 innodb全文索引


PS:此次经验总结实则当了知识的搬运工,感恩前辈们的付出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql建立中英文全文索引(mysql5.7以上) 的相关文章

随机推荐

  • c++ 中map 的find 用法

    用find函数来定位数据出现位置 它返回的一个迭代器 当数据出现时 它返回数据所在位置的迭代器 如果map中没有要查找的数据 它返回的迭代器等于end函数返回的迭代器 程序演示 include
  • java.lang.String cannot be cast to [Ljava.lang.Object;错误的原因及解决办法

    错误信息 java lang ClassCastException java lang String cannot be cast to Ljava lang Object at com six biz impl ReportBizImpl
  • 认识网络、几种常用的网络拓扑图

    交换协议 VLAN技术 虚拟局域网 STP技术 生成树协议 VRRP技术 虚拟路由冗余协议 VPN 虚拟专用网络 名词解释 路由协议 http HTTPS tcp ip 静态路由配置 OSPF协议 RIP协议 ACL访问控制 什么是网络 简
  • 【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

    目录 专栏导读 4 数据库操作 4 1 连接数据库 4 2 执行 SQL 查询和更新 4 3 使用模型和视图显示数据 5 多线程编程 5 1 多线程编程的概念和优势 5 2 在 PyQt 中使用多线程 5 3 处理多线程间的同步和通信问题
  • 论文带读——3D Neural Field Generation using Triplane Diffusion

    论文带读 3D Neural Field Generation using Triplane Diffusion YssssMikey Tips 我会基本上几天更新一篇论文引读 一般是AIGC模型 3D Diffusion方向每日在Arxi
  • JDBC的实现(IDEA版)

    前期准备 开发环境 IDEA 2021 1 3 JAVA 1 8 MYSQL 8 0 32 msql用户名 root 密码 123 下载MySQL JDBC 驱动 前往MySQL官网下载对应版本的MySQL Connector J驱动 下载
  • pix2pix gan_用python构建pix2pix gan

    pix2pix gan There are times that we want to to transform an image into another style Let s say we have a fine collection
  • 基于WOA-SVM算法的乳腺肿瘤识别算法的MATLAB仿真

    基于WOA SVM算法的乳腺肿瘤识别算法的MATLAB仿真 随着医疗技术的发展 计算机在医学影像领域中的应用越来越广泛 乳腺肿瘤是女性常见的一种肿瘤 准确地进行乳腺肿瘤检测和诊断对女性健康至关重要 本文将介绍一种基于WOA SVM算法的乳腺
  • centos下git相关操作以及部分问题解决方案

    主要记录两件事情 一个是如何git clone github代码到本地 二是git clone到非空文件夹下出错的解决方案 第一 在电脑没有安装git的情况下 手动安装git 具体步骤如下 1 安装依赖的包 yum install curl
  • c++使用curl库发送https请求

    一 环境win7 64位 vs2010 二 文件准备 2 1文件下载 libcurl 下载页面 http curl haxx se download html 我下载的是https curl haxx se download curl 7
  • angular项目打包发布流程

    1 从git更新代码 运行测试看有没有错误 测试ie兼容性 2 修改配置文件并编译打包代码 修改连接服务器的配置文件 双击 3 拷贝文件到服务器 xshell连接到linux 命令 pwd 查看当然文件目录 ll 列出该文件下所有的文件列表
  • Visual Studio 2019解决右侧工具栏消失

    项目场景 准备打开Visual Studio 2019却发现右侧的工具栏消失了 问题描述 新建项目后发现右侧的解决方案资源管理器消失了 不便于添加源文件书写代码 如图 原因分析 可能是以前在操作中将项目移除或删除等等将窗口删掉了 解决方案
  • 用jquery实现简单的表单验证效果

    看了 锋利的jquery 一书 练习了下期中的一个用jquery写表单验证的例子 效果如图 总结 这是个比较简单的表单验证 主要验证了表单中的用户名和邮箱两个必填选项 表单验证其实质是个不断往下过滤的过程 主要思路
  • selenium自动化录入数据

    将csv或者txt里的数据通过selenium自动录入到网页系统里 输入一个数据操作完后自动输入下一个数据 依次遍历所有的数据 比如百度搜索 有十个词要搜索 输入第一个词搜出结果后再接着输入第二个继续搜 依次遍历十个 求大神赐教 给个思路或
  • 21天打卡挑战学习MySQL——《SQL基础入门》第二周 第四篇

    活动地址 CSDN21天学习挑战赛 一 什么是SQL MySQL是一个关系型数据库管理系统 前世 瑞典MySQLAB公司 今生 属于Oracle旗下产品 MySQL是最好的RDBMS Relational Database Manageme
  • Unity游戏界面点击深色模式,游戏会退出问题的解决方法

    问题 在Unity游戏接入到android平台上时 经常会遇到这样的问题 游戏玩着玩着 点击深色模式 游戏会突然退出 具体情形下图所示 一 点击深色模式游戏退出 二 正常情况 三 解决方法 在AndroidManifest xml里 对继承
  • 【Linux】线程详解之线程概念

    前言 在我们的教材中 对线程给出以下的概念 是进程内部的一个执行分支 在进程的内部运行 属于进程的一部分 比进程更加轻量化 可能有的人看完之后都是懵的 什么叫在进程的内部运行 什么又是执行分支 为什么比进程轻量化 我们就带着这三个问题 重新
  • 2023超细致的性能测试流程,你get了吗?

    性能测试 利用工具模拟大量用户操作 验证系统承受的负载情况 性能测试的目的 找到潜在的性能问题或瓶颈 分析并解决 找出性能变化趋势 为后续扩展系统提供参考 测试监控 基准测试 配置测试 负载测试 稳定性测试 对硬件和中间件进行监控 1 学习
  • ubuntu安装ftp服务器(一般配置)

    ubuntu安装ftp服务器 1 安装vsftpd sudo apt get install vsftpd ubuntu10 10自己装了 这步省略 2 配置vsftpd 2 1 修改vsftpd的配置文件 此类配置文件通常位于 etc 目
  • Mysql建立中英文全文索引(mysql5.7以上)

    一 概念 使用索引是数据库性能优化的必备技能之一 在MySQL数据库中 有四种索引 主键索引 普通索引 唯一索引以及我们这里将要介绍的全文索引 FUNLLTEXT INDEX MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检