3

晚上好,

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

我有一个包含视频游戏名称和软件名称的数据库表。现在我想通过在其他服务器上获取和解析 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 人类革命缺少链接

batch_name 说:

Deus Ex 人类革命缺少链接DLC

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

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

数据库 = Lego Star Wars The Complete Saga
batch_name = Lego Star Wars : The Complete Saga
结果:False

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

4

2 回答 2

3

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

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

MySQL 有一些匹配工具可能会有所帮助。我看到在我写这篇文章的时候,有人已经在评论中提到了FULLTEXT 和 MATCH ()。这些是一个很好的方法。

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

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

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

于 2013-03-08T21:59:34.350 回答
1

正如您所发现的, MySQL 查询可以将百分号字符用作百分号 (%) 与 LIKE 运算符结合使用。

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

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

于 2013-03-08T22:02:54.863 回答