MySQL 自然语言全文搜索
简介:在本教程中,您将通过使用
MATCH()
和AGAINST()
函数了解MySQL自然语言全文搜索。
MySQL自然语言全文搜索简介
在自然语言全文搜索中,MySQL查找与自由文本自然人类语言查询相关的行或文档,例如,“如何使用MySQL自然语言全文搜索”。 相关性是一个正浮点数。当相关性为零时,意味着没有相似性。MySQL根据各种因素计算相关性,包括文档中的单词数,文档中唯一单词的数量,集合中单词的总数以及包含特定单词的文档(行)数。 要执行自然语言全文搜索,请使用MATCH()
和 AGAINST()
运行。MATCH()
函数指定要搜索的列,AGAINST()
函数确定要使用的搜索表达式。
MySQL自然语言全文搜索示例
我们将使用示例数据库中的products
表进行演示。
+--------------------+ | products | +--------------------+ | productCode | | productName | | productLine | | productScale | | productVendor | | productDescription | | quantityInStock | | buyPrice | | MSRP | +--------------------+ 9 rows in set (0.00 sec)首先,您需要 使用以下
ALTER TABLE ADD FULLTEXT
语句在products
表的productLine
列中启用全文搜索:
ALTER TABLE products ADD FULLTEXT(productline);其次,您可以搜索其产品系列包含术语的产品
Classic
。您使用MATCH()
和AGAINST()
函数作为以下查询:
SELECT productName, productline FROM products WHERE MATCH(productline) AGAINST('Classic');
+-------------------------------------+--------------+ | productName | productline | +-------------------------------------+--------------+ | 1952 Alpine Renault 1300 | Classic Cars | | 1972 Alfa Romeo GTA | Classic Cars | | 1962 LanciaA Delta 16V | Classic Cars | | 1968 Ford Mustang | Classic Cars | | 2001 Ferrari Enzo | Classic Cars | | 1969 Corvair Monza | Classic Cars | | 1968 Dodge Charger | Classic Cars | | 1969 Ford Falcon | Classic Cars | | 1970 Plymouth Hemi Cuda | Classic Cars | | 1969 Dodge Charger | Classic Cars | ...要搜索其产品系列包含
Classic
或Vintage
术语的产品,您可以执行以下查询:
SELECT productName, productline FROM products WHERE MATCH(productline) AGAINST('Classic,Vintage');
+-------------------------------------------+--------------+ | productName | productline | +-------------------------------------------+--------------+ | 1937 Lincoln Berline | Vintage Cars | | 1936 Mercedes-Benz 500K Special Roadster | Vintage Cars | | 1917 Grand Touring Sedan | Vintage Cars | | 1911 Ford Town Car | Vintage Cars | | 1932 Model A Ford J-Coupe | Vintage Cars | | 1928 Mercedes-Benz SSK | Vintage Cars | | 1913 Ford Model T Speedster | Vintage Cars | | 1934 Ford V8 Coupe | Vintage Cars | | 18th Century Vintage Horse Carriage | Vintage Cars | | 1903 Ford Model A | Vintage Cars | | 1917 Maxwell Touring Car | Vintage Cars | | 1941 Chevrolet Special Deluxe Cabriolet | Vintage Cars | | 1932 Alfa Romeo 8C2300 Spider Sport | Vintage Cars | | 1904 Buick Runabout | Vintage Cars | | 1939 Cadillac Limousine | Vintage Cars | | 1939 Chevrolet Deluxe Coupe | Vintage Cars | | 1938 Cadillac V-16 Presidential Limousine | Vintage Cars | | 1912 Ford Model T Delivery Wagon | Vintage Cars | | 1937 Horch 930V Limousine | Vintage Cars | | 1940 Ford Delivery Sedan | Vintage Cars | | 1936 Mercedes Benz 500k Roadster | Vintage Cars | | 1936 Chrysler Airflow | Vintage Cars | | 1928 Ford Phaeton Deluxe | Vintage Cars | | 1930 Buick Marquette Phaeton | Vintage Cars | | 1952 Alpine Renault 1300 | Classic Cars | | 1972 Alfa Romeo GTA | Classic Cars | ...
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如何根据结果集的相关性对结果集中的行进行排名。MATCH()
在WHERE子句中使用函数时 ,MySQL首先返回更相关的行。
以下示例显示MySQL如何按相关性对结果集进行排序。
首先,为表的productName
列启用全文搜索功能 products
。
ALTER TABLE products ADD FULLTEXT(productName);其次,搜索名称包含
Ford
和/或 1932
使用以下查询的产品:
SELECT productName, productline FROM products WHERE MATCH(productName) AGAINST('1932,Ford');让我们来看看输出:
+-------------------------------------+------------------+ | productName | productline | +-------------------------------------+------------------+ | 1932 Model A Ford J-Coupe | Vintage Cars | | 1932 Alfa Romeo 8C2300 Spider Sport | Vintage Cars | | 1968 Ford Mustang | Classic Cars | | 1969 Ford Falcon | Classic Cars | | 1940 Ford Pickup Truck | Trucks and Buses | | 1911 Ford Town Car | Vintage Cars | | 1926 Ford Fire Engine | Trucks and Buses | | 1913 Ford Model T Speedster | Vintage Cars | | 1934 Ford V8 Coupe | Vintage Cars | | 1903 Ford Model A | Vintage Cars | | 1976 Ford Gran Torino | Classic Cars | | 1940s Ford truck | Trucks and Buses | | 1957 Ford Thunderbird | Classic Cars | | 1912 Ford Model T Delivery Wagon | Vintage Cars | | 1940 Ford Delivery Sedan | Vintage Cars | | 1928 Ford Phaeton Deluxe | Vintage Cars | +-------------------------------------+------------------+ 16 rows in set (0.00 sec)产品其名称中包含两个
1932
和 Ford
先返回,然后他们的名字中包含的不仅是产品 Ford
关键字。
使用全文搜索时,您应记住以下几点:
- 在MySQL全文搜索引擎定义的搜索词的最小长度为4。这意味着,如果你搜索其长度小于4例如关键字
car
,cat
等等,你不会得到任何结果。 - 停用词被忽略。MySQL定义了MySQL源代码分发中的停用词列表
storage/myisam/ft_static.c
MATCH()
和AGAINST()
函数在MySQL中执行自然语言搜索。