MySQL - 全文搜索

MySQL - 全文搜索 首页 / MySQL入门教程 / MySQL - 全文搜索

全文搜索是一种用于的搜索技术,会检查文档中的所有单词是否与搜索条件完全匹配

FTS搜索技术通常由诸如 google mozilla ,或 bing 等搜索引擎使用。所有这些搜索引擎将数据从网站收集到数据库中并根据关键字进行搜索。它在网站上为博客,新闻,电子商务等网站进行了强大的搜索结果。

关于mysql中的全文搜索的重要点:

  • 性能                -  mysql需要扫描整个表,以基于模式查找完全匹配的匹配项,指定的模式或正则表达式语句。
  • 灵活搜索        -  mysql没有灵活的搜索查询,因为类似于和正则表达式检查基于模式匹配的搜索。
  • 相关性排名    -  它没有任何特定方式来指定结果集中的哪一行与搜索关键字更相关。
  • 存储引擎        -  全文不支持所有存储引擎。它只支持 myisam innodb 存储引擎。

语法

MySQL使用以下语法执行全文搜索:

MATCH (col1, col2, col3, and so on) AGAINST (expression [search_modifier])

在此语法中,无涯教程将首先指定 match ()函数,其中包含由逗号分隔的列名列表。然后,对函数的采用一个字符串,用于使用可选修饰符来搜索,以指示执行了哪种搜索类型。 search_modifier 可以是自然语言模式或自然语言模式,具有查询扩展或布尔模式或查询扩展。

全文搜索函数

以下是MySQL全文搜索的一些重要函数:

  • 本机SQL类似的接口  -  mysql使用sql样语句执行全文搜索。
  • 完全动态索引              -  只要在列中发生数据修改,MySQL会自动更新该文本列的索引。
  • 索引大小                      -  全文索引大小相对较小。
  • 速度                              -  全文搜索技术快速检查基于复杂搜索查询的数据。

全文搜索限制

  • 全文只支持InnoDB和Myisam表。
  • 它也不支持分区表。
  • match()函数参数必须是从表中的表中的相同列列表,除非match()在MyISAM表上处于布尔模式。
  • 无法使用"%"通配符以获取全文搜索。
  • 可以为 char,varchar ,或text列创建全文索引。

Create Table 创建全文索引

使用CREATE TABLE语句创建新表时定义全文索引,如下所示:

CREATE TABLE table_name(
	column_name1 data type,
	column_name2 data type,
	.....,
	FULLTEXT (column1, column2,..)
);

这里 table_name 是新表的名称, column_name 是列的名称, fulltext 表示包含的全文索引括号中的逗号分隔列名单列表。

以下语句创建一个名为Articles的新表。此表具有包含文章内容列的全文索引:

mysql> CREATE TABLE Articles (
	id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
	title VARCHAR(220),
	body TEXT,
	FULLTEXT (title, body)
);

接下来,无涯教程将填写该表中的记录:

mysql> INSERT INTO Articles VALUES
('0', 'MySQL Tutorial', 'MySQL tutorial provides basic and advanced concepts for beginners ...'),
('0', 'How To Install MySQL', 'Here we will learn how we to download and install MySQL ...'),
('0', 'Optimising MySQL', 'In this tutorial we will show ...'),
('0', 'MySQL vs. MongoDB', 'In the following database comparison ...'),
('0', 'MySQL Versions', 'This section shows all MySQL versions ...');

如果在where子句中使用match()函数,则首先使用最高相关性值自动对返回的行进行排序。基于单词数,唯一单词的数量,集合中的单词的总数和包含特定字的行的数量来计算相关性。

无涯教程网

mysql> SELECT * FROM articles 
WHERE MATCH (title, body) AGAINST ('tutorial');

以下是执行了针对字符串"tutorial"的全文搜索的输出:

MySQL FULLTEXT SEARCH (FTS)

让无涯教程看到另一个例子,即显示如何显式检索:

mysql> SELECT id, MATCH (title, body) AGAINST ('tutorial') FROM Articles;

以下是未返回的行的输出:

MySQL FULLTEXT SEARCH (FTS)

Alter Table创建全文索引

MySQL还提供ALTER TABLE语句,可在现有表上创建全文索引。以下语法更清楚地说明了它:

ALTER TABLE table_name  
ADD FULLTEXT (column1, column2,?)

在此语法中,需要首先指定表名以创建索引。其次,使用添加fulltext子句将全文索引定义为一个或多个列。

例如,有一个名为 books  的表,其中包含列ID,title,content和author。现在可以定义contentauthor列的全文索引,如下所示:

mysql> ALTER TABLE books ADD FULLTEXT (content, author)

创建全文索引

无涯教程还可以使用Create Index语句为现有表创建全文索引。以下语法更清楚地说明了它:

CREATE FULLTEXT INDEX index_name
ON table_name (idx_column1, idx_column2,...)

例如,有一个名为 Office 的表,其中包含列 conderd_line1 conderd_line2 。现在,可以使用以下语句为这些列创建全文索引:

mysql> CREATE FULLTEXT INDEX address
ON office (address_line1, address_line2)

删除全文索引

mysql提供了从表中删除全文索引的命令。可以通过使用下面给出的alter table drop index语句来执行此操作:

ALTER TABLE table_name DROP INDEX index_name;

在此语法中,无涯教程首先指定了表的名称,然后指定了全文索引名称,后跟 drop index 子句。

例如,执行以下语句将永久删除"offices"表中的address索引:

mysql> ALTER TABLE offices DROP INDEX address;

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入浅出区块链 -〔陈浩〕

面试现场 -〔白海飞〕

说透中台 -〔王健〕

Go 并发编程实战课 -〔晁岳攀(鸟窝)〕

手把手带你搭建秒杀系统 -〔佘志东〕

自动化测试高手课 -〔柳胜〕

说透元宇宙 -〔方军〕

技术领导力实战笔记 2022 -〔TGO 鲲鹏会〕

AI大模型系统实战 -〔Tyler〕

好记忆不如烂笔头。留下您的足迹吧 :)