MySQL全文索引最强教程

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL全文索引最强教程

原文链接:blog.ouyangsihai.cn >> MySQL全文索引最强教程

MySQL全文索引支持三种模式,这三种模式的功能都不一样。

  • Natural Language

这种可以成为自然语言搜索,自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除双引号(“)字符外,没有特殊的运算符。

如果指定了IN NATURAL LANGUAGE MODE修饰符,则全文搜索是自然语言搜索,如果没有给出用哪种模式,默认就是 Natural Language 模式。

  • Boolean

布尔搜索使用特殊查询语言的规则解释搜索字符串。该字符串包含要搜索的单词。它还可以包含指定要求的运算符,例如,匹配行中必须存在或不存在一个单词,或者其权重应高于或低于平常。

  • Query Expansion

查询扩展搜索是对自然语言搜索的修改,这种查询通常在查询的关键词太短,用户需要隐含知识进行,简单来说就是,我们查询database的时候,这种查询还会把MySQL、Oracle、SQLServer这些事数据库的相关关键词查询出来。

通过上面的介绍之后,大概知道了这几种查询的作用,下面我们看一下如何使用这三种全文索引的模式。


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

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

上面就是全文索引的语法,MySQL数据库通过 MATCH()--AGAINST语法支持全文检索,MATCH指定需要查询的列,AGAINST指定用上面的哪种模式进行查询。

下面,将一一的介绍这几种模式的具体使用方法。

1 Natural Language

首先,我们介绍Natural Language模式,为了介绍这种模式,我们先创建一张表。


CREATE TABLE t_fulltext(
    FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
    body TEXT,
    PRIMARY KEY(FTS_DOC_ID)
);

接着插入一些数据;


INSERT INTO t_fulltext value(NULL,'Recently, I saw an interesting movie.');
INSERT INTO t_fulltext value(NULL,'A girl wrote a letter to herself. She would receive it in ten years. It is meaningful.');
INSERT INTO t_fulltext value(NULL,'If we read the letter, we will think of the old days and recall of the happiness. ');
INSERT INTO t_fulltext value(NULL,'So I decide to write a letter to me in the future. I want to remind myself of the passion I owned. ');

接着为body字段创建全文索引;


CREATE FULLTEXT INDEX idx_fulltext ON t_fulltext(body);

我们使用Natural Language模式进行查询操作,注意一下,如果我们不写使用哪种模式,默认就是使用Natural Language模式;


SELECT * FROM t_fulltext 
WHERE MATCH(body)
AGAINST ('letter' IN NATURAL LANGUAGE MODE);

查询之后,得到了下面的查询结果;

我们再用EXPLAIN来查询一下;


EXPLAIN
SELECT * FROM t_fulltext 
WHERE MATCH(body)
AGAINST ('letter' IN NATURAL LANGUAGE MODE);

type的类型是fulltext,说明使用了全文检索查询。

目前就简单的讲了一下全文检索的基本使用。

2 Boolean

这一部分我们讲解一下Boolean模式进行全文检索,布尔模式比自然语言模式稍微复杂一点,但是其实理解起来也是很容易的,使用也非常的简单,使用Boolean查询的时候,我们一般会在查询的字符串前面添加一些特殊的字符,这些字符都有他们特定的意义,我们接下来看看有哪些字符,并且如何使用。

  • +表示必须出现

  • =表示一定不能出现

  • (no operator) 表示该word是可选的,但是如果出现,其相关性会更高

  • @distance 表示查询的多个单词之间的距离是否在distance之内,distance的单位是单词。这种全文索引的查询也称为proximity Search。如MATCH(body)AGAINST(‘“letter I”@20’ IN BOOLEAN MODE) 表示字符串letter和I之间的距离需在20个单词范围内。

  • > 表示出现该单词时增加相关性

  • < 表示出现该单词时降低相关性

  • ~ 表示运行出现该单词,但是出现时相关性为负

    • 表示以该单词开头的单词,如lik* 可以表示lik、like、likes之类的。
  • “ 表示短语。

接下来,我们再利用上面建立的表介绍Boolean查询。

查询有letter和read的文档


SELECT * FROM t_fulltext 
WHERE MATCH(body)
AGAINST ('+letter +read' IN Boolean MODE);

查询有letter但没有read的文档


SELECT * FROM t_fulltext 
WHERE MATCH(body)
AGAINST ('+letter -read' IN Boolean MODE);

查询letter并且使用 > 增加相关性


SELECT body,
MATCH(body) AGAINST ('letter >read' IN Boolean MODE)
AS Relevance FROM t_fulltext;

用 “ 表示短语


SELECT * FROM t_fulltext 
WHERE MATCH(body)
AGAINST ('"read the letter"' IN Boolean MODE);

以上就是关于Boolean模式的使用了。

3 Query Expansion

这种查询模式在前面已经介绍过了,就是可以对一些隐含的词语也可以同时查询出来,比如我们只是查询Database,这个时候会把具体的数据库,比如MySQL,Oracle等也会查询出来。

通过使用 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION或者 WITH QUERY EXPANSION可以使用这种模式。

我们先插入几条关于数据库的数据到表中,然后我们再进行查询;


INSERT INTO t_fulltext value(NULL,'MySQL is a very good database');
INSERT INTO t_fulltext value(NULL,'Oracle so');
INSERT INTO t_fulltext value(NULL,'lost of database');
INSERT INTO t_fulltext value(NULL,'DB2 is well');

我们先使用自然语言查询;


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

我们再用Query Expansion查询;


SELECT * FROM t_fulltext 
WHERE MATCH(body)
AGAINST ('database' WITH QUERY EXPANSION);

这个时候就会多出几条数据!

4 总结

以上就是关于这三种全文索引查询模式的使用和讲解了。

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL全文索引最强教程


 上一篇
Java11正式发布了,我们该怎么办? Java11正式发布了,我们该怎么办?
主题互动Java11已经发布了,我们今天聊聊大家还停留在哪个版本呢?大家对于新版本的迅速的发布有什么想说的呢? 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。 我们都知道,前面的
下一篇 
MySQL的又一神器-锁,MySQL面试必备 MySQL的又一神器-锁,MySQL面试必备
原文链接:blog.ouyangsihai.cn >> MySQL的又一神器-锁,MySQL面试必备 1 什么是锁1.1 锁的概述在生活中锁的例子多的不能再多了,从古老的简单的门锁,到密码锁,再到现在的指纹解锁,人脸识别锁,