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

时间:2015-07-30 09:17:58

标签: php mysql n-gram

所以这是一种情况:

我需要找到一种匹配2个相似字符串的方法,例如:

a - SAMSUNG Galaxy S5 White

b - Mobile phone SAMSUNG GALAXY S5 WHITE

我在数据库字段中有字符串a,现在我有来自外部源的等效字符串。显然这是同一个产品,但如果我直接搜索标题字段,搜索将无法产生预期的结果。

任何想法如何进行查找,都会寻找相似的字符串? 也许将字符串分解为令牌?我写的任何查询会根据这些令牌查看吗?在这种情况下,MySQL 5.7.6中引入的ngram查找功能是否有用?

还有其他建议吗?

4 个答案:

答案 0 :(得分:1)

在其他答案中描述的使用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的文档页面。

答案 1 :(得分:0)

使用SQL:

private void displayDialog() {
    customDialog = new Dialog(this);
    customDialog.setTitle(getResources().getString(R.string.share));
    customDialog.setContentView(R.layout.dialog);

    etTitle = (EditText) customDialog.findViewById(R.id.etTitle);
    etDescription = (EditText) customDialog.findViewById(R.id.etDescription);

    if(caller == 1) {

        String userVersion = dbHelper.getUserVersion(userId);

        if((userVersion != null && !userVersion.isEmpty())
                && !userVersion.equalsIgnoreCase("TLC")) {

            if(ConnectionDetector.hasNetworkConnection(this)) {
                scrapeTask = new ScrapeAsyncTask();
                scrapeTask.execute();
            } else {
                Toast.makeText(this,
                        getResources().getString(R.string.no_internet_connection),
                        Toast.LENGTH_SHORT).show();
            }

        } else {
            etTitle.setKeyListener(null);
            etTitle.setText(verse);
            etDescription.setText("\"" + text + "\"");
            etDescription.requestFocus();
        }

    } else {
        etTitle.setHint(text);
        etTitle.requestFocus();
        etDescription.setHint(text);
    }

    customDialog.show();
}

这将从您的列名中选择您的价值。通配符SELECT column_name(s) FROM table_name WHERE column_name LIKE %pattern%; 是零个或多个字符的替代。以下是%

的一些documentation

答案 2 :(得分:0)

选中“赞”可能会有所帮助mysql Like

答案 3 :(得分:0)

您可以这样写:

SELECT column_name
FROM table_name
WHERE column_name LIKE %key%;

您将获得column_name包含密钥的结果。