【问题标题】: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)
      

      【讨论】:

        猜你喜欢
        • 2014-08-09
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 2012-06-28
        • 2021-07-21
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多