【问题标题】:How to use MySQL Full Text search for Turkish characters?如何使用 MySQL 全文搜索土耳其语字符?
【发布时间】:2021-01-18 18:42:21
【问题描述】:
我有一个存储在 MySQL 上的小型数据集,我想避免使用/管理 ElasticSearch/Sphinx 等实例,保持索引更新等,并使用 MySQL 全文索引来搜索它们。
但我的特殊要求是进行模糊搜索,当关键字为“Turkce”时可以找到“Türkçe”,反之亦然。
我不熟悉术语,因此无法在功能之间做出决定。我怎么能用 MySQL 做到这一点?我应该使用 Soundex 还是其他任何功能?
非常感谢。
【问题讨论】:
标签:
mysql
elasticsearch
search
solr
sphinx
【解决方案1】:
你有几个选择。
最简单的方法(如果它对您正确)是将 FULLTEXT 索引中涉及的列的 MySql 排序规则设置为utf8mb4_unicode_ci(或utf8_unicode_ci)。如果您的列已经使用 unicode 编码,那么这样做不会丢失数据。不区分大小写的 _ci 编码将许多带有 diareses 的字符视为它们的朴素对应物。但这种排序规则最适用于西欧语言,如瑞典语(MySql 的开发者所在的国家/地区)。试一试。请告诉我们它对土耳其语的效果如何。
如果不起作用,请尝试为要搜索的每一列存储两列。一个应该包含实际值,另一个应该包含 search slug 值。您可以使用自己制作的存储函数从实际值计算搜索段值。然后,在搜索 slug 列上创建 FULLTEXT 索引。
每当您进行搜索时,您都会将用户提供的搜索词转换为其等效的搜索词并进行搜索。
搜索 slug 存储函数将您的带分叉符的字符(如 ç)转换为它们的等价物,如 c。以下是有关创建该存储函数的一些想法。 How to remove accents in MySQL?
SOUNDEX 对您的目的完全没有价值。它是几十年前发明的,当时计算机有数千个内存位置,用于查找北美专有名称的特定目的。
【解决方案2】:
create table lang(t varchar(200), FULLTEXT INDEX(t));
insert into lang values ('Türkçe');
insert into lang values ('Turkce');
mysql> select * from lang;
+--------+
| t |
+--------+
| Türkçe |
| Turkce |
+--------+
2 rows in set (0.00 sec)
mysql> select * from lang where t like '%Turkce%';
+--------+
| t |
+--------+
| Türkçe |
| Turkce |
+--------+
2 rows in set (0.00 sec)