所以这是一种情况:
我需要找到一种匹配2个相似字符串的方法,例如:
a - SAMSUNG Galaxy S5 White
b - Mobile phone SAMSUNG GALAXY S5 WHITE
我在数据库字段中有字符串a
,现在我有来自外部源的等效字符串。显然这是同一个产品,但如果我直接搜索标题字段,搜索将无法产生预期的结果。
任何想法如何进行查找,都会寻找相似的字符串? 也许将字符串分解为令牌?我写的任何查询会根据这些令牌查看吗?在这种情况下,MySQL 5.7.6中引入的ngram查找功能是否有用?
还有其他建议吗?
答案 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%;
是零个或多个字符的替代。以下是%
答案 2 :(得分:0)
选中“赞”可能会有所帮助mysql Like
答案 3 :(得分:0)
您可以这样写:
SELECT column_name
FROM table_name
WHERE column_name LIKE %key%;
您将获得column_name包含密钥的结果。