mysql 中文字段名_MySQL全文索引怎么做?| 教程分享

- 点击上方“爱数据学习社”关注我们吧! -

50feb0166ded6623cd8ef2184b546962.gif

文末领取【商业分析资料】

e4940493a34f532b46d39dacb6d382fb.png为什么要用全文索引

我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因:

  • like查询太慢、json字段查询太慢(车太慢了)

  • 没时间引入ElasticSearch、Solr或者Sphinx这样的软件,或者根本就不会用(无法将五菱宏光换成兰博基尼,即使有兰博基尼也不会开)

  • 加索引、联合索引啥的都已经慢得不行了(限速80,车顶盖都卸了也只能开到30)

  • 为了提升一下自己的格调(人家问你有没有开过法拉利,你说开过肯定更有气质一点)

e4940493a34f532b46d39dacb6d382fb.png什么是全文索引

简单的说,全文索引就相当于大词典中的目录,通过查询目录可以快速定位到想看的内容。


全文索引通过建立倒排索引来快速匹配文档(仅在mysql5.6版本以上支持),全文索引将连续的字母、数字和下划线当做一个单词,分割单词一般用空格/逗号/句号。

MySQL的全文索引支持以下3种查询模式:

  • 自然语言模式(IN NATURAL LANGUAGE MODE)
    通过MATCH AGAINST 传递某个特定的字符串来进行检索

  • 布尔模式(IN BOOLEAN MODE)
    支持操作符,例如+表示包含,-表示不包含

  • 扩展模式(WITH QUERY EXPANSION)
    相当于自然语言模式下的一个扩展,执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索.

下面教大家如何创建全文索引,并创建测试数据演示三种查询模式的使用。

e4940493a34f532b46d39dacb6d382fb.png如何创建全文索引

1. 建表时指定

CREATE TABLE light_weight_baby (     id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,     title VARCHAR(200),     content TEXT,     FULLTEXT(title, content) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

2. ALTER添加

ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1,column2,...);

3. CRATE INDEX添加

CREATE FULLTEXT INDEX index_name ON table_name (column1,column2,...);
e4940493a34f532b46d39dacb6d382fb.png创建测试数据

创建一个数据库用来演示这三种模式下的检索:

CREATE DATABASE chenqionghe DEFAULT CHARSET utf8;

创建一个文章表并插入测试数据

CREATE TABLE articles (    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    title VARCHAR(200),        body TEXT,    FULLTEXT (title,body)) ENGINE=InnoDB;

插入测试数据

INSERT INTO articles (title,body) VALUES    ('MySQL Tutorial','DBMS stands for DataBase ...'),    ('How To Use MySQL Well','After you went through a ...'),    ('Optimizing MySQL','In this tutorial we will show ...'),    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    ('MySQL vs. YourSQL','In the following database comparison ...'),    ('MySQL Security','When configured properly, MySQL ...');

执行结果如下

69a77c02b23b2bd80761f5b32be89845.png

e4940493a34f532b46d39dacb6d382fb.png查询-使用自然语言模式

这是MySQL的默认查询模式,简单示例如下:

SELECT * FROM articles        WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);

918d1cfca3a5ce266cee61f2a36104d2.png

可以看到,不区分大小写,title或body包含database的都返回了,另外,返回的结果将以相关性进行排序。

相关性:根据行中的字段、唯一单词的数量、集合中单词总数和包含特定单词的行数计算。

下面通过两种方式统计数量:

# 第一种方式 SELECT COUNT(*) FROM articles    WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);# 第二种方式SELECT   COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))    AS count    FROM articles;

7c6348e0a186db84499479d6130a467d.png

第一种做了一些额外的工作(按相关性对结果进行排序),但也能使用索引进行查询。


第二种执行了全表扫描,如果搜索项出现在大多数行中,可能比索引查询更快。

匹配少数行,第一种快,匹配大多数行,第二种快。

下面演示如何检索相关性,但不会进行排序(因为不包含WHERE和ORDER BY)

SELECT id, MATCH (title,body)     AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score         FROM articles;

acb76b5062152956ac148f63bd735711.png

下面的示例更复杂,返回倒序后的相关性值,分别在SELECT和WHERE语句中使用了MATCH,但是不会导致额外的开销,因为mysql优化器注意到两次MATCH是相同的,只会使用一次全文搜索。

SELECT id, body, MATCH (title,body) AGAINST    ('Security implications of running MySQL as root'    IN NATURAL LANGUAGE MODE) AS score        FROM articles WHERE MATCH (title,body) AGAINST    ('Security implications of running MySQL as root'    IN NATURAL LANGUAGE MODE);

7cbe547d8856aaef4bf64766de1d9322.png

包含在("")中字符中的会被分解为单词,然后在全文索引中进行搜索,简单的说,就是进行OR查询。

e4940493a34f532b46d39dacb6d382fb.png查询-使用布尔模式(强大的语法)

使用布尔模式需要指定IN BOOLEAN MODE,不会自动根据相关性排序,一些字符具有特殊的含义,例如可以通过+或-表示一个单词必须存在或不存在。


下面的sql语句代表查询必须 包含MySQL但不包含YourSQL

SELECT * FROM articles WHERE MATCH (title,body)    AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

10b2b43439872c6bae2dfa375f5e4b68.png

语法:

ee4f00e86427b9437f2049f62f117aa3.png

示例:

18b263416335760942ae85f04eb11185.png

e4940493a34f532b46d39dacb6d382fb.png查询-使用扩展模式

当搜索短语很短时非常有用,例如搜索database可能意味着MySQL、Oracle、DB2、RDBMS都要被匹配到,这就是这个模式能做的。


添加WITH QUERY EXPANSION或 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION启用,它会执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索。


例如下面的例子:

# 自然语言模式SELECT * FROM articles     WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);# 扩展模式SELECT *     FROM articles        WHERE MATCH (title,body)    AGAINST ('database' WITH QUERY EXPANSION);

ee75939ecd2134ad0e7137663c373930.png

可以看到第二条语句找到了包含MySQL的行,即使该行不包含database,但是因为在第一次的搜索中搜索引擎判断MySQL和database的相关性比较高,所以在执第二次搜索的时候返回了。

e4940493a34f532b46d39dacb6d382fb.png注意事项
  • 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引

  • MATCH (字段) AGAINST (关键词),必须和创建时的字段一起,例如MATCH (light,weight,baby)使用的字段名与全文索引muscle(light,weight,baby)定义的字段名一致。如果只对单个字段查询,需要分别创建全文索引

  • 全文索引是以词为基础的,innodb_ft_min_token_size和innodb_ft_max_token_size用来设置单词的最大和最小长度,不在这个长度区间的将忽略

  • 在停用词stopwords中的将被忽略

  • 如果要导入大量数据,先导入数据再建全文索引,比先建全文索引再导入数据的方式快很多

  • 在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,MySQL 5.7.6后内置了ngram全文解析器,支持中文、日文、韩文分词。

End.

作者:无涯

来源:博客园

本文为转载分享,如有侵权请联系后台删除

44e60465f9a14122750c913844befbdb.png

· 爱数据每周免费直播 ·

直播主题:留学生:海归如何做好职业生涯规划?

直播内容:

  • “四大”等咨询公司和外企是不是优选?

  • 留学生如何放大优势?

  • 如何更好的适应国内的工作环境?

直播时间:6月24日  周三晚20:30准时直播分享

ce598b9b7df77b8358413fddf5bb2e35.png

3a319ec230eb18a19d8b79b14ac2c064.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos php mysql 5.6 安装_centos 6.8 yum安装 PHP 5.6

1.检查当前安装的PHP包。yum list installed | grep php2.如果有安装的PHP包,先删除他们。先复制到文本中,编辑成一行,在执行。yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64php-mbstring.x86_64 p…

leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?

之前谈了怎样后台导出SAP序时账,因为导出的序时账数据量较大(3家主体公司,2017-2020年的数据),用了数据库MYSQL中的LEFT JOIN 来处理连接多表汇总数据,查询太慢啦,后来沦落到用手工分年来汇总数据,然后再导…

python 画布包括不了全部组件?_试验程序:画布版九键琴

近期有读者询问如何制作出滑动琴键连续发出声音的程序,他尝试用一排按钮充当琴键,但每次滑动只能触发一个按钮的点击事件,因此也只能发出一个声音。我提示他用画布替代按钮,他希望给予更具体的提示,于是我索性自己做了…

c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象

一.static1.它是一种修饰符2.使用位置:它用来修饰成员变量和成员方法static修饰成员变量,叫类变量;static修饰成员方法,叫类方法;类成员类变量类方法没有使用static修饰成员变量,叫实例变量;没有…

keil中断函数的写法_在 KeilC里,中断子程序与函数有何不同?( )_学小易找答案

【单选题】8051单片机共有( )个中断优先级【单选题】对定时器 0 进行关中断操作,需要复位中断允许控制寄存器的: ( )【多选题】真理向谬误转化的原因,主要在于( )【多选题】“批判的武器当然不能代替武器的批判,物质的力量只能用物质的力量来摧毁,理论一经群众掌握,也会变成物质…

c++ stack 遍历_C/C++内存分配!

一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)…

python读取oracle数据到hvie parquet_关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中...

说明:spark版本:2.2.0hive版本:1.2.1需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spark-sql程序实现将该文件读取并以parquet的格式通过外部表的形式…

el-date-picker设置默认日期_程序员必备:Java 日期处理的十个坑

前言整理了Java日期处理的十个坑,希望对大家有帮助。一、用Calendar设置时间的坑反例:Calendar c Calendar.getInstance();c.set(Calendar.HOUR, 10);System.out.println(c.getTime());运行结果:Thu Mar 26 22:28:05 GMT08:00 2020解析&…

scope python_Python标准库Scope

作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!1 模块简介你一定在很多计算机科学课程上听说过作用域。它很重要,如果你不理解它的工作原理,那么就会出现一些令人…

java命令_JAVA与模式之命令模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述命令(Command)模式的:命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化&#xf…

android 16进制 全透明_你有几种实现方案Android 设备唯一标识?

前言项目开发中,多少会遇到这种需求:获得设备唯一标识DeviceId,用于:1.标识一个唯一的设备,做数据精准下发或者数据统计分析;2.账号与设备绑定;3.....分析这类文章,网上有许多资料&a…

链表的数据域怎么使用结构体_一步一步教你从零开始写C语言链表

为什么要学习链表?链表主要有以下几大特性:1、解决数组无法存储多种数据类型的问题。2、解决数组中,元素个数无法改变的限制(C99的变长数组,C也有变长数组可以实现)。3、数组移动元素的过程中,要对元素进行大范围的移动…

python计算bmi_Python编程语言:如何用Python编程来判断体重指数BMI是否健康

上一篇小编分享了自己学习Python语言有关字符串和模块time使用的相关知识,这一篇小编分享给大家的是比较有趣的运用,那就是如何用Python编程来表示自己体重BMI。 用Python程序来算出我们自己的BMI指数,来判断我们自己的健康情况,首…

drbd实现mysql地热备_heartheartbeat+drbd+mysql主库热备

1 环境主机名网卡磁盘mastereth0 桥接模式 eth0(192.168.1.10) 自定义模式(VMnet2)(192.168.2.10)VIP 192.168.1.200/210系统盘20G外接磁盘slaveeth0 桥接模式(192.168.1.20) eth1 自定义模式(VMnet2)(192.168.2.20)VIP 192.168.1.200/210系统盘20G外接磁盘server3eth0 桥接模式…

dba的前景_运维、测试、程序员,这些技术岗位哪个更有前景?

在一个初具规模的互联网公司,从业务方面出发,有很多岗位类型,比如运营、客服、市场、产品、设计、技术等等。在这些大类下面,还要细分各种小类,以技术为例,可分为前端(客户端)、后端、测试、运维、DBA等等&…

mysql深度解析_百万级数据下的mysql深度解析

mysql 作为一款非常优秀的免费数据库被广泛的使用,平时我们开发的项目数据过百万的时候不多。最近花了大量的时间来深入的研究mysql百万级数据情况下的优化。 遇到了很多问题并解决了他们,特此分享给大家。欢迎提出您的宝贵意见!一、百万级数…

python异步实现方式_Python通过yield实现异步

改写程序first函数等待long函数返回值的方式为yield,代码如下: import _thread import time gen None def long(): print (long execute) def fun(): time.sleep(5) result long end gen.send(result) _thread.start_new_thread(fun,()) def first(): print (firs…

免安装版的mysql步骤_mysql免安装版的安装方法及步骤

mysql免安装版的安装方法及步骤发布时间:2020-07-15 14:07:18来源:亿速云阅读:83作者:清晨小编给大家分享一下mysql免安装版的安装方法及步骤,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧&am…

jupyter notebook怎么写python代码_如何在Jupyter Notebook中使用Python虚拟环境?

如何在使用Jupyter Notebook时,解决Python虚拟环境间的切换问题?本文一步步帮你拆解。希望你能够避免踩坑的痛苦,把更多的时间花在愉快的编程上。 痛点 Python目前有两个主版本并存,这很让人苦恼。 一般人对于软件,总是…

cmd检查java_如何通过cmd查看java环境

展开全部JAVA环境变量设置一、下载JDK。62616964757a686964616fe4b893e5b19e31333363376561下载后是一个可执行程序,双击安装,安装路径为C:\Program Files\Java\jdk1.6.0_22\(当然,其他路径也可以),如下图:二、设置环境…