这是一种情况:
我需要找到一种方法来匹配 2 个相似的字符串,例如:
a - SAMSUNG Galaxy S5 白色
b - 手机SAMSUNG GALAXY S5 WHITE
我在数据库字段中有字符串 a
,现在我有来自外部源的等效字符串。很明显,这是同一产品,但如果我直接搜索标题字段,搜索将不会产生所需的结果。
关于如何进行查找以查找相似字符串的任何想法? 也许将字符串分解成标记?我写的查询是否会根据这些标记查找? MySQL 5.7.6 中引入的 ngram 查找功能在这种情况下是否有用?
还有什么建议吗?
最佳答案
使用 LIKE
正如其他答案中描述的那样不起作用,因为您要搜索的文本不是数据库中内容的子字符串(给定您的示例)。有几种方法可以处理这个问题,具体取决于您的情况。
如果您事先知道可能提供给您的不同变化字符串,您可以创建另一个表aliases
来存储这些字符串并使用外键将它们链接到您的主表。
如果您事先不知道它们,可能是因为它们是用户提供的搜索词,那么您将需要动态构建一个查询来分解这些词并单独搜索它们,如下所示:
SELECT ...
FROM table
WHERE field LIKE '%Mobile%'
OR field LIKE '%phone%'
OR field LIKE '%SAMSUNG%'
OR field LIKE '%GALAXY%'
OR field LIKE '%S5%'
OR field LIKE '%WHITE%'
虽然像这样的东西会找到正确的结果,但它也可能会返回误报(即任何带有“white”或“phone”的词也会被返回),所以这可能不是要走的路。
如果您在 MySQL <= 5.5 中使用 MyISAM 表,或者在 MySQL >= 5.6 中使用 MyISAM 或 InnoDB 表,您可以使用全文搜索和匹配/反对,如下所示:
SELECT MATCH( field ) AGAINST ( 'Mobile', 'phone', 'SAMSUNG', 'GALAXY', 'S5', 'WHITE' ) as relevance
FROM table
WHERE MATCH( field ) AGAINST ( 'Mobile', 'phone', 'SAMSUNG', 'GALAXY', 'S5', 'WHITE' IN BOOLEAN MODE)
ORDER BY relevance DESC
这不仅会找到匹配的行,还会根据相关性(即匹配的数量)对它们进行排序。如果您知道最相关的匹配是正确的,则可以将其限制为 1 行,或者您可以显示以最相关的选项开头的选项列表。
查看 Full-Text Search Functions 的文档页面了解更多信息。
关于php - SQL中匹配多个相似的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719791/