2011-05-31 28 views
1

我在數據庫中有30,000行需要進行相似性檢查(使用similar_text或其他此類函數)。在大型數據庫上進行高性能PHP simaliraty檢查

爲了做到這一點,需要對每列進行30,000^2次檢查。

我估計我會檢查平均4列。

這意味着我將不得不做36億支票。

什麼是最好(最快,最可靠)的方式來做到這一點與PHP,銘記請求內存限制和時間限制等?

服務器需要在執行此操作的同時仍然主動提供網頁。

PS。我們使用的服務器是一個8核Xeon 32 GB內存。

編輯:

每列的大小通常是小於50個字符。

回答

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

我不是真的在搜索,我需要看看1列數據是否比任何其他數據列的數據多90%。 – Petah 2011-05-31 23:46:07

+0

您是否需要將每列與所有其他列進行比較?或者你只有1列1列,你必須與其他人比較? – dynamic 2011-05-31 23:49:02

+1

每一行的列對列的列。 – Petah 2011-05-31 23:59:09

0

oy ... similar_text()是O(n^3)!

您是否確實需要每次比較的百分比相似度,或者您是否可以快速比較字符串的第一個/中間/最後一個X字節以縮小字段?

如果你只是在尋找dups的話......你可以縮小你需要做的比較次數,那將是最有效的方法。

相關問題