晚上好,
我在尝试构建一个小搜索算法时面临一个小问题。
我有一个包含视频游戏名称和软件名称的数据库表。现在我想通过在其他服务器上获取和解析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 ......)?
答案 0 :(得分:3)
您正在寻找模糊搜索算法和模糊搜索结果。这是一个完整的研究领域。但是,如果你快速浏览一下谷歌,还有一些简单的教程可以帮助你入门。
你可能想尝试类似PHP的精彩levenshtein方法,它计算两个字符串的“接近度”。但是,这需要将其与每条记录进行匹配。如果有数千条记录,那就不可能了。
MySQL有一些可能有用的匹配工具。我看到,当我写这篇文章时,有人已在评论中提到FULLTEXT and MATCH()。这是一个很好的方式。
还有一些其他好的解决方案可供研究。存储关键字的索引(包括所有文章和帮助程序,如/ / / / / / is / is / was / of / from),然后搜索搜索中的每个单词是一个简单的解决方案。但是,它没有产生很好的结果,因为返回的值没有很好地加权,并且根本没有本地化。
有许多廉价而精彩的第三方搜索工具(Lucene浮现在脑海中),它将为您完成大部分工作。您只需调用API,他们就可以管理缓存,关键字,索引,模糊等搜索。
以下是一些与模糊搜索相关的SO问题,它们可以帮助您找到更多术语和想法:
答案 1 :(得分:1)
MySQL queries,正如您所发现的那样,可以将百分比字符用作与LIKE运算符一起的小丑(%)。
根据您的需要,您有多种解决方案。
请记住,您可以在多个通道中进行搜索(搜索完全匹配,然后搜索每一侧的百分比,在单词中爆炸,然后在每个单词之间插入%,按关键字搜索等),具体取决于完全匹配是否优先于关闭搜索等。