我在数据库中有30,000行需要进行相似性检查(使用similar_text
或其他此类函数)。
为了做到这一点,需要对每列进行30,000 ^ 2次检查。
我估计我将平均检查4列。
这意味着我将不得不进行3,600,000,000次检查。
使用PHP执行此操作的最佳(最快,最可靠)方法是什么,还要考虑请求内存限制和时间限制等?
服务器需要在执行此操作的同时仍然主动提供网页。
PS。我们使用的服务器是一个8核Xeon 32 GB RAM。
修改
每列的大小通常少于50个字符。
答案 0 :(得分:1)
我猜你只需要全文搜索。
如果这不适合你,你只有一次机会解决这个问题:缓存结果。 因此,您不必为每个请求解析3bil记录
无论如何,你如何做到这一点:
$result = array();
$sql = "SELECT * FROM TABLE";
while( $row = ... ) {
$result[] = $row; //> Append the current record
}
现在结果包含表格中的所有行。
此时你说你想要similar_text()
所有列彼此
要做到这一点并缓存结果,至少需要一个表(正如我在评论中所说)。
//> Starting calculating the similarity
foreach($result as $k=>$v) {
foreach($result as $k2=>$v2) {
//> At this point you have 2 rows, $v and $v2 containing your column
$similarity = 0;
$similartiy += levensthein($v['column1'],$v2['column1']);
$similartiy += levensthein($v['column2'],$v2['column2']);
//> What ever comparison you need here between columns
//> Now you can finally store the result by inserting in a table the $similarity
"INSERT DELAYED INTO similarity (value) VALUES ('$similarity')";
}
}
你必须注意的两件事:
我使用 levensthein 因为它比similar_text快得多(注意它的值与similar_text相反,因为levensthein返回的值越大,字符串之间的亲和力越小)
我使用 INSERT DELAYED 来大大降低数据库成本
答案 1 :(得分:0)
oy ... similar_text()是O(n ^ 3)!
你真的需要每个比较的百分比相似性,或者你可以快速比较字符串的第一个/中间/最后X个字节来缩小字段吗?
如果你只是在寻找重复说...你可以缩小你需要做的比较次数,这将是最有效的方法。