MySQL自然语言全文搜索

时间:2019-11-20 08:52:21  来源:igfitidea点击:

简介:在本教程中,您将通过使用MATCH()和AGAINST()函数学习MySQL自然语言全文搜索。

MySQL自然语言全文搜索简介

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

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

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

MySQL自然语言全文搜索示例

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

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

ALTER TABLE products 
ADD FULLTEXT(productline);

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

SELECT 
    productName, 
    productLine 
FROM products 
WHERE 
    MATCH(productLine) 
    AGAINST('Classic');

要搜索产品线包含经典或复古术语的产品,可以使用以下查询:

SELECT 
	productName, 
    productLine 
FROM products 
WHERE 
	MATCH(productline) 
    AGAINST('Classic,Vintage')
ORDER BY productName;

默认情况下,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)

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

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

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

下面的示例向您展示MySQL如何根据相关性对结果集进行排序。

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

ALTER TABLE products 
ADD FULLTEXT(productName);

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

SELECT 
	productName, 
    productLine 
FROM products 
WHERE 
	MATCH(productName) 
    AGAINST('1932,Ford');

这是输出:

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

使用全文搜索时,您应该记住一些重要事项:

  • MySQL全文搜索引擎中定义的搜索词的最小长度为4。
    这意味着,如果您搜索长度小于4的关键字(例如car,cat),则不会获得任何结果。

  • 停止词(Stop words)将被忽略。
    MySQL在MySQL源代码发行版storage / myisam / ft_static.c中定义了停止词列表

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