php - SQL中匹配多个相似的字符串

标签 php mysql n-gram

这是一种情况:

我需要找到一种方法来匹配 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/

相关文章:

php - Google+ 圈子数据库逻辑

php - 函数的局部变量的值必须在多次调用该函数时保留。该变量应该如何在 PHP 中声明

mysql - 无效的日期时间格式 : 1292 Truncated incorrect DOUBLE value

php - 如何更改 "Many to Many"关系中的变量?

python - 如何找到 ngram 在句子中的位置?

python - 非英语语言(CJK等)的n-gram名称分析

php - 通过拖放将声音分配给元素

php - CakePHP 分页最大限制不起作用

MySQL 找出 select 语句中使用了哪个 WHERE 子句

mahout - apache mahout 中的 nGram