MySQL 精确 URL 搜索
MySQL exact URL search
所以我正在尝试合并两个公司信息数据库(Table A 和 Table B 从这里开始),其中最常见(和可靠)的单一参考点是网站URL。 Table A 是最新的,Table B 待更新。
我已经从 Table A 中提取了 URLs 并使用 PHP 清理了它们(大约 6000 URLs)并且计划是找到并根据找到的 URL 更新 Table B 中的一些信息(但不是 URL 本身)。
在 Table A 中,URL 都是 domain.com
或 www.domain.com
或 www.subdomain.domain.com
,没有 http:// 或任何尾随的 /或其他 URL 数据。在 Table B 中,它们是原始的 URLs,其中可能包含任何额外信息,例如 http:// 等
现在我已经尝试通过 Table B 中的 URL 搜索公司,如下所示:
SELECT * FROM companies WHERE website LIKE '%$url1%' OR website LIKE '%$url2%'...
虽然这有效,但它也会提取不正确的信息。例如,我在 Table A 的列表中没有 bt.com
(或任何变体),但它在 Table B 中匹配(有一个 www.corporate.bt.com
在 Table A 中,我认为它匹配)。
那么,我怎样才能阻止这种情况发生呢?它显然在 URL 列表中找到了类似的东西,但我只想匹配确切的字符串。所以在上面的例子中,如果我正在搜索 www.corporate.bt.com
它应该只 return 如果它在一个字符串中找到它(http://www.corporate.bt.com/
很好, http://bt.com/
不是)
此外,对于这么大的数据集,执行此操作的最佳方式是什么? Table A 有大约 6,000 URLs,Table B 有 14,000(并非所有 Table A 都在 Table B 中)。
LIKE 不会 return 精确搜索,但您可以使用 MySql REGEXP
进行精确搜索,它会在搜索字段中找到精确结果,而 return 只能精确搜索url
SELECT * FROM companies WHERE website REGEXP '[[:<:]]$url1[[:>:]]' OR
website REGEXP '[[:<:]]$url2[[:>:]]'
或者如果归档只有一个 url 那么你可以使用 =
operator
SELECT * FROM companies WHERE website = '$url1' OR website = '$url2'
更新
在此您可以扩展 REGEX 搜索并仅输入 SERVER_NAME
例如 domain.com
、domain1.com
、abc.domain.com
,请参阅下面的查询
$url = "doamin.com";
$url1 = "domain1.com";
SELECT * FROM companies WHERE
website REGEXP '^(htt(p|ps):\/\/|htt(p|ps):\/\/www\.)($url)$' OR
website REGEXP '^(htt(p|ps):\/\/|htt(p|ps):\/\/www\.)($url1)$'
原来我没有过滤掉 Table A 中的地址列表,看来 'http' 中的 url 漏掉了- 这意味着每个包含 'http' 的 url 都被发现...
所以我添加了另一个过滤器来检查是否存在 .在 URL 中,这确保它至少是 something.something
if (strpos($domain, ".") !== false) {
// It has a .±
}
所以我正在尝试合并两个公司信息数据库(Table A 和 Table B 从这里开始),其中最常见(和可靠)的单一参考点是网站URL。 Table A 是最新的,Table B 待更新。
我已经从 Table A 中提取了 URLs 并使用 PHP 清理了它们(大约 6000 URLs)并且计划是找到并根据找到的 URL 更新 Table B 中的一些信息(但不是 URL 本身)。
在 Table A 中,URL 都是 domain.com
或 www.domain.com
或 www.subdomain.domain.com
,没有 http:// 或任何尾随的 /或其他 URL 数据。在 Table B 中,它们是原始的 URLs,其中可能包含任何额外信息,例如 http:// 等
现在我已经尝试通过 Table B 中的 URL 搜索公司,如下所示:
SELECT * FROM companies WHERE website LIKE '%$url1%' OR website LIKE '%$url2%'...
虽然这有效,但它也会提取不正确的信息。例如,我在 Table A 的列表中没有 bt.com
(或任何变体),但它在 Table B 中匹配(有一个 www.corporate.bt.com
在 Table A 中,我认为它匹配)。
那么,我怎样才能阻止这种情况发生呢?它显然在 URL 列表中找到了类似的东西,但我只想匹配确切的字符串。所以在上面的例子中,如果我正在搜索 www.corporate.bt.com
它应该只 return 如果它在一个字符串中找到它(http://www.corporate.bt.com/
很好, http://bt.com/
不是)
此外,对于这么大的数据集,执行此操作的最佳方式是什么? Table A 有大约 6,000 URLs,Table B 有 14,000(并非所有 Table A 都在 Table B 中)。
LIKE 不会 return 精确搜索,但您可以使用 MySql REGEXP
进行精确搜索,它会在搜索字段中找到精确结果,而 return 只能精确搜索url
SELECT * FROM companies WHERE website REGEXP '[[:<:]]$url1[[:>:]]' OR
website REGEXP '[[:<:]]$url2[[:>:]]'
或者如果归档只有一个 url 那么你可以使用 =
operator
SELECT * FROM companies WHERE website = '$url1' OR website = '$url2'
更新
在此您可以扩展 REGEX 搜索并仅输入 SERVER_NAME
例如 domain.com
、domain1.com
、abc.domain.com
,请参阅下面的查询
$url = "doamin.com";
$url1 = "domain1.com";
SELECT * FROM companies WHERE
website REGEXP '^(htt(p|ps):\/\/|htt(p|ps):\/\/www\.)($url)$' OR
website REGEXP '^(htt(p|ps):\/\/|htt(p|ps):\/\/www\.)($url1)$'
原来我没有过滤掉 Table A 中的地址列表,看来 'http' 中的 url 漏掉了- 这意味着每个包含 'http' 的 url 都被发现...
所以我添加了另一个过滤器来检查是否存在 .在 URL 中,这确保它至少是 something.something
if (strpos($domain, ".") !== false) {
// It has a .±
}