【问题标题】:Perform accent insensitive fulltext search MySQL执行不区分重音的全文搜索 MySQL
【发布时间】:2013-01-24 07:57:05
【问题描述】:

我目前正在为网站开发搜索功能。用户按名称搜索其他用户。对于名字带有口音的用户,我很难获得好的结果。

我在 name 列上有一个 FULLTEXT 索引,表的排序规则是 utf8_general_ci。

目前,如果有人注册了该站点,并且有一个带重音符号的名称(例如:Alberto Andrés),则该名称将存储在 DB 中,如下图所示:

因此,如果我执行以下查询SELECT * MATCH(name) AGAINST('alberto andres'),我会得到很多匹配分数更高的结果,例如“Alberto”、“Andres”、“Andrés”,最后匹配分数较低的用户可能正在寻找的记录“阿尔贝托·安德烈斯。

我可以做些什么来考虑重音记录当前在数据库中的存储方式?

谢谢!

【问题讨论】:

    标签: php mysql utf-8 full-text-search diacritics


    【解决方案1】:

    在我看来,el Señor Andrés 的姓氏实际上存储正确。您向我们展示的渲染是一些非 UTF 应用程序处理 UTF8 文本的方式。

    如果您的表中还没有大量记录,您可以尝试对查询进行这种修改。全文(非布尔)模式在小型数据集上工作异常。

    SELECT *  
      FROM TABLE
    WHERE MATCH(name) AGAINST('alberto andres' IN BOOLEAN MODE)
    

    你也可以试试

    SELECT *  
      FROM TABLE
    WHERE MATCH(name) AGAINST(CONVERT('alberto andres' USING utf8))
    

    只是为了确保您的匹配字符串与您的 MySQL 列使用相同的字符集。

    【讨论】:

    • 感谢奥利的回答!布尔模式不会改善结果。并且“使用 utf8”返回相同的记录。有趣的是,如果我在 php 上执行 utf8_encode('Alberto Andrés') 并将输出传递给查询,我会得到 Alberto Andrés 作为第一个结果。当用户在搜索查询中输入不带重音的名称时,我仍然没有弄清楚解决方案。
    • 我知道有点晚了,但这些都不能改善我的搜索。我遇到用户可以输入“Z、C、S、D”的情况,但 DB 必须返回包含“Ž、Š、Č、Ć 和 Đ”的结果。整个上午都在网上搜索没有结果:D.
    猜你喜欢
    • 2012-12-17
    • 2019-03-21
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2011-02-12
    • 2015-04-22
    • 2018-07-17
    相关资源
    最近更新 更多