mysql - 我可以使用自由文本词执行 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 技巧来解决这个问题,还是需要一些其他方法/算法才能进行更多的临时搜索?
解决方案
如果您有这样的 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 !)
推荐阅读
- python - 如何将两个不同字典中的键相互映射?
- c# - 在 Web 表单之间发送变量
- python - PySpark DataFrame:查找最接近整数列值的数组列索引
- java - 为了安宁,我应该对不同的获取请求使用一种方法还是将它们分开
- typescript - 当字符串与对象的键不匹配时强制类型错误
- php - SimplesamlPHP 配置
- swift - 我在哪里可以在 Mac 上获得 PEM 编码的私钥和 DER 编码的证书路径?
- python - SQLAlchemy 与额外数据(关联对象)的多对多关系 - 如何删除
- python - 使用无向图而不是多向图获得结果
- go - golang 模板中的 Slack 提及