首页 > 解决方案 > 我可以使用自由文本词执行 MySQL 搜索吗?

问题描述

如何使用自由文本搜索条目在 MySQL 表中查找项目?

例如,我有一张简单的葡萄酒表,如下所示:

id  |  wine
================================
 1    Bollinger Special Cuvée Brut
 2    Bollinger R.D. Extra Brut 
 3    Bollinger La Grande Année  
 4    Bollinger La Grande Année Brut 

我之前曾使用 LIKE 模式方法来搜索例如“La Grande”( WHERE wine LIKE '%La Grande%'),它适用于更精确的搜索短语。

但是,如果用户提供了诸如“Bollinger Brut”或“Cuvee”(没有重音)之类的字符串,则 LIKE 模式方法将找不到任何匹配项。我可以使用一些 MySQL 技巧来解决这个问题,还是需要一些其他方法/算法才能进行更多的临时搜索?

标签: mysql

解决方案


如果您有这样的 FULLTEXT 索引:

CREATE TABLE `wine` (
  `id` int DEFAULT NULL,
  `wine` varchar(200) DEFAULT NULL,
  FULLTEXT KEY `wine` (`wine`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

然后:

select * from wine where match(wine) against('Bollinger Brut' in boolean mode);

将选择:

+------+--------------------------------+
| id   | wine                           |
+------+--------------------------------+
|    1 | Bollinger Special Cuvée Brut   |
|    2 | Bollinger R.D. Extra Brut      |
|    4 | Bollinger La Grande Année Brut |
|    3 | Bollinger La Grande Année      |
+------+--------------------------------+

和:

mysql> select * from wine where match(wine) against('Cuvee' in boolean mode);
+------+------------------------------+
| id   | wine                         |
+------+------------------------------+
|    1 | Bollinger Special Cuvée Brut |
+------+------------------------------+

笔记:

select 
   id, 
   wine, 
   ROUND(match(wine) against('Bollinger Brut' in boolean mode) ,5) score
from wine 
where match(wine) against('Bollinger Brut' in boolean mode);

将会呈现:

+------+--------------------------------+---------+
| id   | wine                           | score   |
+------+--------------------------------+---------+
|    1 | Bollinger Special Cuvée Brut   | 0.01561 |
|    2 | Bollinger R.D. Extra Brut      | 0.01561 |
|    4 | Bollinger La Grande Année Brut | 0.01561 |
|    3 | Bollinger La Grande Année      | 0.00000 |
+------+--------------------------------+---------+

因为“Bollinger La Grande Année”没有“Brut”分数较低。(但它不是 0 !)


推荐阅读