【问题标题】:how to compare parts of 2 strings in php如何在php中比较2个字符串的部分
【发布时间】:2013-03-08 21:39:53
【问题描述】:

晚上好,

我在尝试构建一个小搜索算法时遇到了一个小问题。

我有一个包含视频游戏名称和软件名称的数据库表。现在我想通过在其他服务器上获取和解析 xml 文件来添加新的报价。问题是:

如何比较产品名称的字符串,以便即使优惠名称与存储在我的数据库中的产品名称不匹配 100% 也能正常工作?

作为一个例子,我目前正在使用这个 PHP + SQL 代码来比较字符串:

$query_GID = "select ID,game from gkn_catalog where game like '%$batch_name%' or meta like '%$batch_name%' ";

我目前正在结合使用 like 运算符和两个通配符来比较优惠名称 (batch_name) 和数据库中的名称 (game )。


我想知道如何改进这一点,因为这种方法不是很安全,或者你想怎么称呼它,会发生什么:

如果数据库显示游戏名称是:

Deus Ex 人类革命缺少链接

并且批处理名称说:

Deus Ex Human Revolution 缺少链接DLC

结果将是空的/错误的/错误的......它根本不会在我的数据库中找到游戏。

类似这样的事情也是如此:

数据库 = 乐高星球大战完整传奇
batch_name = 乐高 星球大战 完整的传奇
结果:错误

有没有更好的方法来执行 SQL 查询?
或者我怎样才能尝试让该查询正常工作,以便它可以处理带有特殊字符的字符串(如 -minus- 和 [括号])
和/或数据库名称中未包含的字符(如 DLC、CE...)?

【问题讨论】:

标签: php sql compare


【解决方案1】:

您正在寻找模糊搜索算法和模糊搜索结果。这是一个完整的研究领域。但是,如果您快速 google 一下,也有一些简单的教程可以帮助您入门。

您可能很想尝试类似 PHP 的奇妙 levenshtein 方法,它计算两个字符串的“接近度”。但是,这需要将其与每条记录进行匹配。如果会有数千条记录,那是不可能的。

MySQL 有一些匹配工具可能会有所帮助。我看到在我写这篇文章的时候,有人已经在 cmets 中提到了FULLTEXT and MATCH()。这些都是不错的选择。

还有其他一些不错的解决方案可供研究。存储关键字索引(删除所有文章和助手,如 of/the/an/am/is/are/was/of/from),然后在搜索中搜索每个单词是一个简单的解决方案。但是,它不会产生很好的结果,因为返回的值没有很好地加权,并且根本没有本地化。

还有许多便宜又出色的第三方搜索工具(我想到了 Lucene),它们可以为您完成大部分工作。您只需调用一个 API,它们就会管理搜索的缓存、关键字、索引、模糊等。

这里有一些与模糊搜索相关的 SO 问题,可以帮助你找到更多的术语和想法:

【讨论】:

  • 非常感谢您提供这么多可能的解决方案的链接,我会确保阅读所有这些,然后我会决定哪一个效果最好。顺便说一句,我可以问一下,你为什么说对数千条记录使用 levenshtein 方法是没有问题的?我可以想象这种方法的使用对功率要求很高,或者很慢,但是,有数千条记录,执行这种比较的每种方法都会很慢而且也很耗电......
  • Levenshtein 通过 PHP 会很慢,因为在大型数据集上检索表中的每条记录以执行比较是不切实际的。 SQL 数据库做了很多花哨的内部操作来优化比较和搜索(索引、索引、索引),通常需要在这个级别进行大型操作。
【解决方案2】:

MySQL queries,您发现可以将百分号字符用作小丑 (%) 与 LIKE 运算符结合使用。

您有多种解决方案,具体取决于您想要什么。

  • 你可以发一个fulltext search
  • 您可以使用soundex 等语言算法进行搜索
  • 您可以按关键字搜索

请记住,您可以进行多次搜索(搜索完全匹配,然后在每一边搜索百分比,在单词中爆炸然后在每个单词之间插入 %,按关键字搜索等),具体取决于完全匹配是否优先于关闭搜索等。

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2012-05-05
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多