Mysql 简明教程

MySQL Full-Text Search 允许我们搜索存储在数据库中的基于文本的数据。在对表的列执行全文搜索之前,我们必须在这些列上创建一个全文索引。

FTS(全文搜索)提供了通过大型文本内容(例如博客、文章等)匹配搜索的字符串值的能力。

MySQL Full-Text Search

要在 MySQL 表上执行全文搜索,我们在 SQL SELECT 语句的 WHERE 子句中使用 MATCH() 和 AGAINST() 函数。

在 MySQL 上执行全文搜索的基本语法如下 −

SELECT column_name(s) FROM table_name
WHERE MATCH(col1, col2, ...)
AGAINST(expression [search_modifier])

在此,

  1. MATCH() 函数包含用逗号分隔的一个或多个要搜索的列。

  2. AGAINST() 函数包含用于全文搜索的搜索字符串。

以下是有关 MySQL 中全文搜索的一些要点 −

  1. InnoDB 或 MyISAM 表都使用全文索引。全文搜索的字词的最小长度对于 InnoDB 表为三个字符,对于 MyISAM 表为四个字符。

  2. 全文索引可以在基于文本的列中创建(CHAR、VARCHAR 或 TEXT 列)。

  3. 可以在使用 CREATE TABLE 语句创建表时定义 FULLTEXT 索引,也可以在稍后使用 ALTER TABLE 或 CREATE INDEX 语句定义。

  4. 如果没有 FULLTEXT 索引,将大型数据集加载到表中的速度要比将数据加载到具有现有 FULLTEXT 索引的表中的速度要快。因此,建议在加载数据后创建索引。

Types of Full-Text Searches

有三种全文搜索类型。描述如下:

  1. Natural Language Full-Text Searches: 这允许用户使用自然的语言输入搜索查询,而无需特殊字符或运算符。搜索引擎会检查用户输入的查询,并根据用户的意图返回相关结果。

  2. Boolean Full-Text Searches: 这允许我们基于布尔模式执行全文搜索,其中带有布尔运算符,例如 +、-、>、<、()、~、*、""。

  3. Query Expansion Searches: 这扩展了用户的查询,以基于自动相关反馈或盲查询扩展来扩大全文搜索的搜索结果。

Creating MySQL FULLTEXT Index

在 MySQL 中,我们可以在创建新表时或在现有表上为特定列定义全文索引。这可以通过以下三种方式完成:

  1. Using the FULLTEXT Keyword

  2. 使用 ALTER TABLE 语句

  3. 使用 CREATE INDEX 语句

Using the FULLTEXT Keyword

要在创建新表时为列定义全文索引,我们在 CREATE TABLE 查询中对该列使用 FULLTEXT 关键字。以下是语法:

CREATE TABLE table_name(
   column1 data_type,
   column2 data_type,
   ...,
   FULLTEXT (column1, column2, ...)
);

让我们首先创建一个名为 FILMS 的表,并使用以下查询对 NAME 和 DIRECTOR 列定义全文索引:

CREATE TABLE FILMS (
   ID int auto_increment not null primary key,
   NAME varchar(50),
   DIRECTOR TEXT,
   FULLTEXT (NAME, DIRECTOR)
);

现在,让我们使用以下查询将值插入到此表中:

INSERT INTO FILMS (NAME, DIRECTOR) VALUES
('RRR', 'Directed by Rajamouli'),
('Bahubali', 'Directed by Rajamouli'),
('Avatar', 'Directed by James cameron'),
('Robot', 'Directed by Shankar');

该表将被创建为:

在此,我们使用 MATCH 和 AGAINST 函数,如下所示,从 FILMS 表中获取 NAME 或 DIRECTOR 列与字符串“Rajamouli”匹配的所有行:

SELECT * FROM FILMS
WHERE MATCH (NAME, DIRECTOR)
AGAINST ('Rajamouli');

正如我们在以下输出中所看到的,已经针对字符串“Rajamouli”执行了全文搜索,并且它返回了包含此字符串的行。

Using the ALTER TABLE Statement

在 MySQL 中,我们可以使用 ALTER TABLE 语句为现有表中的特定列创建全文索引。以下是语法:

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

在此示例中,我们对先前创建的 FILMS 表的 NAME 和 DIRECTOR 列定义了一个名为 FULLTEXT 的全文索引:

ALTER TABLE FILMS ADD FULLTEXT (NAME, DIRECTOR);

现在,让我们从 FILMS 表中检索 NAME 或 DIRECTOR 列与字符串“Shankar”匹配的所有行。

SELECT * FROM FILMS
WHERE MATCH (NAME, DIRECTOR)
AGAINST ('Shankar');

输出如下:

Using the CREATE INDEX Statement

在 MySQL 中,我们还可以使用 CREATE INDEX 语句为现有表创建全文索引。以下是语法:

CREATE FULLTEXT INDEX index_name
ON table_name (index_column1, index_column2,...)

我们正在使用 FILMS 表中 NAME 和 DIRECTOR 列的名称 INDEX_FULLTEXT 创建全文索引 −

CREATE FULLTEXT INDEX INDEX_FULLTEXT ON FILMS (NAME, DIRECTOR);

现在,让我们从 FILMS 表中检索所有满足以下查询中所示字符串值的 NAME 或 DIRECTOR 列的行 −

SELECT * FROM FILMS
WHERE MATCH(NAME, DIRECTOR)
AGAINST ('James Cameron');

输出如下:

Dropping MySQL FULLTEXT index

在 MySQL 中,我们可以使用 ALTER TABLE DROP INDEX 语句从表中删除或丢弃全文索引。

以下是语法 -

ALTER TABLE table_name DROP INDEX index_name;

在以下查询中,我们将删除前面创建的全文索引 −

ALTER TABLE FILMS DROP INDEX INDEX_FULLTEXT;

让我们通过执行以下查询来验证索引是否已被丢弃 −

SELECT * FROM FILMS
WHERE MATCH(NAME, DIRECTOR)
AGAINST ('James Cameron');

正如我们在输出中看到的,全文索引已在 NAME 和 DIRECTOR 列中删除。

ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list

Full-Text Search Using Client Program

除了使用 MySQL 查询执行全文搜索,我们还可以使用客户端程序执行。

Syntax

Example

以下是这些程序 −