MySQL Natural Language Full-Text Searches

摘要:在本教程中,您将通过使用MATCH()AGAINST()函数了解 MySQL 自然语言全文搜索。

MySQL自然语言全文搜索简介

在自然语言全文搜索中,MySQL 查找与自由文本自然人类语言查询相关的行或文档,例如“如何使用 MySQL 自然语言全文搜索”。

相关性是一个正浮点数。当相关性为零时,意味着不存在相似性。 MySQL 根据各种因素计算相关性,包括文档中的单词数、文档中的唯一单词数、集合中的单词总数以及包含特定单词的文档(行)数。

要执行自然语言全文搜索,可以使用MATCH()AGAINST()函数。 MATCH()函数指定要搜索的列, AGAINST()函数确定要使用的搜索表达式。

MySQL自然语言全文检索示例

我们将使用示例数据库中的products表进行演示。

首先,使用ALTER TABLE ADD FULLTEXT语句在products表的productLine列中创建全文搜索:

ALTER TABLE products 
ADD FULLTEXT(productline);Code language: SQL (Structured Query Language) (sql)

其次,您可以搜索产品系列包含术语Classic的产品。您可以使用MATCH()AGAINST()函数作为以下查询:

SELECT 
    productName, 
    productLine 
FROM products 
WHERE 
    MATCH(productLine) 
    AGAINST('Classic');Code language: SQL (Structured Query Language) (sql)
MySQL 自然语言全文搜索

要搜索产品线包含ClassicVintage术语的产品,您可以使用以下查询:

SELECT 
	productName, 
    productLine 
FROM products 
WHERE 
	MATCH(productline) 
    AGAINST('Classic,Vintage')
ORDER BY productName;Code language: SQL (Structured Query Language) (sql)

MySQL 自然语言全文搜索示例
AGAINST()函数默认使用IN NATURAL LANGUAGE MODE搜索修饰符,因此,您可以在查询中省略它。还有其他搜索修饰符,例如用于布尔文本搜索IN BOOLEAN MODE

您可以在查询中显式使用IN NATURAL LANGUAGE MODE搜索修饰符,如下所示:

SELECT 
	productName, 
    productLine 
FROM products 
WHERE 
	MATCH(productline) 
	AGAINST('Classic,Vintage' IN NATURAL LANGUAGE MODE)Code language: SQL (Structured Query Language) (sql)
MySQL 自然语言全文 - 自然语言模式

默认情况下,MySQL 以不区分大小写的方式执行搜索。但是,您可以指示 MySQL 使用索引列的二进制排序规则执行区分大小写的搜索。

按相关性对结果集进行排序

全文搜索的一个非常重要的功能是 MySQL 如何根据结果集中的行的相关性对它们进行排名。当MATCH()函数在WHERE子句中使用时,MySQL 首先返回更相关的行。

以下示例展示了 MySQL 如何按相关性对结果集进行排序。

首先,为products表的productName列创建全文搜索。

ALTER TABLE products 
ADD FULLTEXT(productName);Code language: SQL (Structured Query Language) (sql)

其次,搜索名称包含Ford和/或1932的产品:

SELECT 
	productName, 
    productLine 
FROM products 
WHERE 
	MATCH(productName) 
    AGAINST('1932,Ford');Code language: SQL (Structured Query Language) (sql)

这是输出:

MySQL 自然语言全文搜索 - 按相关性对结果集进行排序

首先返回名称中同时包含1932Ford产品,然后返回名称中包含唯一Ford关键字的产品。

使用全文搜索时应记住一些要点:

  • MySQL全文搜索引擎定义的搜索词的最小长度为4。这意味着如果您搜索长度小于4的关键字,例如carcat ,您将不会得到任何结果。
  • 停用词将被忽略。 MySQL定义了一个停用词列表在MySQL源代码分布storage/myisam/ft_static.c

在本教程中,您向您展示了如何使用MATCH()AGAINST()函数在 MySQL 中执行自然语言搜索。

本教程有帮助吗?