摘要:在本教程中,您将通过使用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)
要搜索产品线包含Classic
或Vintage
术语的产品,您可以使用以下查询:
SELECT
productName,
productLine
FROM products
WHERE
MATCH(productline)
AGAINST('Classic,Vintage')
ORDER BY productName;
Code language: SQL (Structured Query Language) (sql)
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 如何根据结果集中的行的相关性对它们进行排名。当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)
这是输出:
首先返回名称中同时包含1932
和Ford
产品,然后返回名称中包含唯一Ford
关键字的产品。
使用全文搜索时应记住一些要点:
- MySQL全文搜索引擎定义的搜索词的最小长度为4。这意味着如果您搜索长度小于4的关键字,例如
car
、cat
,您将不会得到任何结果。 - 停用词将被忽略。 MySQL定义了一个停用词列表在MySQL源代码分布
storage/myisam/ft_static.c
中
在本教程中,您向您展示了如何使用MATCH()
和AGAINST()
函数在 MySQL 中执行自然语言搜索。