自然语言全文搜索

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

MySQL自然语言全文搜索简介

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

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

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

MySQL自然语言全文搜索示例

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

mysql> desc products;
+--------------------+---------------+------+-----+---------+------------------+
| Field              | Type          | Null | Key | Default | Extra            |
+--------------------+---------------+------+-----+---------+------------------+
| productCode        | varchar(15)   | NO   | PRI |         |                  |
| productName        | varchar(70)   | NO   |     | NULL    |                  |
| productLine        | varchar(50)   | NO   | MUL | NULL    |                  |
| productScale       | varchar(10)   | NO   |     | NULL    |                  |
| productVendor      | varchar(50)   | NO   |     | NULL    |                  |
| productDescription | text          | NO   |     | NULL    |                  |
| quantityInStock    | smallint(6)   | NO   |     | NULL    |                  |
| buyPrice           | decimal(10,2) | NO   |     | NULL    |                  |
| MSRP               | decimal(10,2) | NO   |     | NULL    |                  |
| stockValue         | double        | YES  |     | NULL    | STORED GENERATED |
+--------------------+---------------+------+-----+---------+------------------+
10 rows in set (0.22 sec)

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

其次,可以搜索产品系列包含Classic的产品,使用MATCH()AGAINST()函数,如下查询:

执行上面查询语句,得到以下结果 -

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

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

执行上面查询语句,得到以下结果 -

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

按相关性排序结果集

全文搜索的一个非常重要的特征是MySQL根据其相关性对结果集中的行进行排序。 当WHERE子句中使用MATCH()函数时,MySQL返回首先更相关的行。

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

首先,可以为products表的productName列启用全文搜索功能。

其次,使用以下查询搜索名称包Ford和/或1932的产品:

我们来查看输出结果:

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

使用全文搜索时,应该记住一些重点:

  • MySQL全文搜索引擎中定义的搜索项的最小长度为4,这意味着如果搜索长度小于4的关键字,例如carcat等,则不会得到任何结果。

  • 停止词被忽略,MySQL定义了MySQL源代码分发storage/myisam/ft_static.c中的停止词列表。

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

Last updated

Was this helpful?