晚上好,
在尝试构建一些搜索算法时,我遇到了一个小问题.
我有一个包含视频游戏名称和软件名称的数据库表.现在,我想通过在其他服务器上获取和解析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)与数据库(游戏)中的名称.
我想知道如何改进此方法,因为此方法不是很安全,也不管您要调用什么方法,结果是:
如果数据库显示游戏标题为:
Deus Ex Human Revolution Missing Link
并且batch_name说:
Deus Ex Human Revolution Missing Link DLC
结果将为空/错误/假…好吧,它根本不会在我的数据库中找到该游戏.
类似的事情也是如此:
Database = Lego Star Wars The Complete Saga
batch_name = Lego
Star Wars : The Complete Saga
Result: False
有没有更好的方法来执行SQL查询?或者,我如何才能使该查询正常工作,使其能够处理带有特殊字符的字符串(例如-minus& [括号])和/或数据库名称中未包含的字符(例如DLC, CE …)?
解决方法:
您正在寻找模糊搜索算法和模糊搜索结果.这是整个研究领域.但是,如果您快速浏览一下Google,也可以使用一些简单的教程来入门.
您可能会想尝试类似PHP的levenshtein方法,该方法计算两个字符串的“紧密度”.但是,这需要将其与每个记录匹配.如果将有成千上万的记录,那就不可能了.
MySQL有一些匹配的工具可能会有所帮助.我看到在撰写本文时,有人已经在评论中提到了FULLTEXT and MATCH().这些是很棒的方法.
还有一些其他好的解决方案可供研究.一个简单的解决方案是存储关键字索引(删除所有与of / the / an / am / is / are / was / of / from相关的文章和帮助程序),然后在搜索中搜索每个单词.但是,由于返回值的权重不佳,而且根本没有本地化,因此效果不佳.
还有很多便宜且出色的第三方搜索工具(会想到Lucene),它将为您完成大部分工作.您只需要调用一个API,它们就可以管理缓存,关键字,索引,模糊化等搜索内容.
以下是与模糊搜索相关的一些SO问题,可帮助您找到更多的术语和想法:
> Lightweight fuzzy search library
> Fuzzy queries to database
> Fuzzy matching on string
> fuzzy searching an array in php