如何在php中比较2个字符串的部分

时间:2013-03-08 21:39:54

标签: php sql compare

晚上好,

我在尝试构建一个小搜索算法时面临一个小问题。

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

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

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

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

我目前正在使用 like 运算符和两张外卡来比较商品名称( batch_name )和数据库中的名称(游戏)。

<小时/> 我想知道如何改进这个方法,因为这个方法不是很安全或者你想要的任何东西,会发生什么:

如果数据库说游戏标题是:

  

Deus Ex Human Revolution Missing Link

并且batch_name说:

  

Deus Ex Human Revolution Missing Link DLC

结果将为空/错误/错误......好吧,它根本无法在我的数据库中找到游戏。

同样的事情:

  

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

有没有更好的方法来进行SQL查询?
或者我如何尝试使该查询正常工作,以便它可以处理带有特殊字符的字符串(如-minus-&amp; [bracket])
和/或未包含在数据库名称中的字符(如DLC,CE ......)?

2 个答案:

答案 0 :(得分:3)

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

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

MySQL有一些可能有用的匹配工具。我看到,当我写这篇文章时,有人已在评论中提到FULLTEXT and MATCH()。这是一个很好的方式。

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

有许多廉价而精彩的第三方搜索工具(Lucene浮现在脑海中),它将为您完成大部分工作。您只需调用API,他们就可以管理缓存,关键字,索引,模糊等搜索。

以下是一些与模糊搜索相关的SO问题,它们可以帮助您找到更多术语和想法:

答案 1 :(得分:1)

MySQL queries,正如您所发现的那样,可以将百分比字符用作与LIKE运算符一起的小丑(%)。

根据您的需要,您有多种解决方案。

  • 您可以制作fulltext search
  • 您可以使用soundex
  • 等语言算法进行搜索
  • 您可以按关键字搜索

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