【问题标题】:How to not search for exact word match using LIKE?如何不使用 LIKE 搜索完全匹配的单词?
【发布时间】:2014-02-14 20:02:08
【问题描述】:

大家好,我正在使用以下查询来选择数据

mysql_query("SELECT * FROM prodcuts WHERE prod_name LIKE '%".$search."%'");

问题是当你搜索让我们说“他”时,它选择的比我想要的多。它需要 'hello' 'helblabla' 和 'he' 的所有内容。

我想做的是,假设您正在搜索 playstation,它接受以下搜索 playstatioq、yplaystation、playstationq 等。 所以我想让搜索与确切的产品名称有一个字母不同。任何想法如何做到这一点?

提前致谢

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    听起来你想要的是Levenshtein distance。在 StackOverflow 上查看 MySQL Levenshtein 了解更多信息。

    【讨论】:

      【解决方案2】:

      扩展 Glen Solsberry 所写的内容,您可以使用“_”(下划线)进行单字母通配符搜索。例如:

      "SELECT * FROM prodcuts WHERE prod_name LIKE '%_".$search."_%'"
      

      如果您的 $search 变量是“laystatio”,则此查询将匹配“playstation”、“yplaystation”、“playstationq”和“playstatioq”。

      如果您的 $search 变量是“playstation”、“playstatioq”或“yplaystation”,则使用 soundex,这个下一个查询应该返回你所追求的结果,加上一个紧密匹配的堆:

      "SELECT * FROM prodcuts WHERE SOUNDEX(prod_name) LIKE SOUNDEX('".$search."')"
      

      【讨论】:

      • 谢谢,我会一直使用它,直到我了解 Levenshtein 距离为止。
      【解决方案3】:

      您可以通过使用 Elastic Search 或 Solr 等为全文查询提供模糊匹配的东西构建索引来潜在地解决您的问题。

      根据您的问题规模、效率要求以及您需要匹配的模糊程度,它可以为您节省大量精力。另一方面,这当然可能是矫枉过正。

      【讨论】:

        猜你喜欢
        • 2011-08-10
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2017-06-25
        • 2019-01-09
        • 2016-10-15
        • 1970-01-01
        相关资源
        最近更新 更多