2013-10-08 113 views
2

我在我的mysql數據庫中有2,000,000個字符串。現在,當一個新的字符串作爲輸入時,我試圖找出該字符串是否已經在我的數據庫中,否則,我插入字符串。位置獨立字符串匹配

字符串匹配

對於我的情況下的定義,在文本中單詞的位置並不重要。只有所有單詞都應該出現在字符串中,並且任何一個字符串中都沒有額外的單詞。

Ex - 拉姆是男孩 AND 男孩是拉姆將被稱爲匹配。 拉姆是個好男孩不匹配。

PS - 請忽略感

現在,我的問題是:如何做這些匹配給出一個字符串(2000000)的數量我要匹配的最佳方式。

解決方案我能想到的:

  1. 指數中的所有SOLR串/獅身人面像
  2. 在新的搜索,我只是將 點擊搜索服務器,並有在最高前10名的字符串考慮

優點: -

  1. 比MySQL全文搜索更快

缺點: - 在MySQL數據庫 用新的查詢更新

  1. 保持搜索服務器。

有沒有其他更好的解決方案,我可以去?任何建議和方法來解決這個問題是最受歡迎的:)

謝謝!

回答

2

您可以計算第二列中包含排序順序的字。然後,只需在該列:)

ALTER TABLE table ADD sorted varchar(255) not null, unique index(sorted); 

那麼唯一索引...(PHP爲了方便,但其他語言將是相似的)

$words = explode(' ',trim($string)); 
sort($words); 
$sorted = mysql_real_escape_string(implode(' ',$words)); 
$string = mysql_real_escape_string($string); 

$sql = "INSERT IGNORE INTO table SET `string`='$string',`sorted`='$sorted'"; 
+0

這是一個很棒的想法:) –

+0

排序的話,摺疊的情況下,刪除重複的 – ChuckCottrill

+0

MySQL的排序規則可能會照顧你的摺疊情況:) – barryhunter

0

通過將所有單詞添加到給定字符串的過濾器來計算每個字符串的布隆過濾器。在任何新的字符串查找中,計算布隆過濾器,並在數據庫中查找匹配的字符串。

你或許可以通過一個相當短的布隆過濾器來獲得,對你的字符串進行一些測試可以告訴你需要多長時間。

+0

你可以有點更具描述性的,好嗎? –

1

我建議創建一些存儲關於您現有數據的信息的表格。 ,以便無論表中有多少數據,在查詢中的「匹配/檢查並插入」邏輯期間,您都不必處理性能問題。

請檢查我在SO上的另一篇文章中針對類似需求所提出的架構建議。

accommodate fuzzy matching

在上面的帖子,以實現您的需求,您需要在我剛纔提到的數據匹配90%的準確率只是一個額外的表。讓我知道如果答案不清楚或者您對此有任何疑問。

編輯-1

在你的情況下,你將有3個表。你已經擁有了一個,你已經存儲了2,000,000條字符串消息。現在我說的另外兩張桌子如下。 第二個表用於存儲所有唯一表達式(所有消息的唯一字) 第三個表用於存儲每個表達式(單詞)和該單詞出現在messgae之間的鏈接。 請參見下面的查詢結果。

enter image description here

enter image description here

現在讓我們說你的投入有一個字符串「是男孩拉姆」 第一提取從字符串中的每個表達你在這個字符串有3個。 「是」和「Ram」和「男孩」。 現在只需完成Select查詢以查看這些全部表達式是否存在於最後一個表 「MyData_ExpressionString」中以獲取單個StringID。我想現在你有更好的照片,你知道下一步該怎麼做。是的,我還沒有創建索引,但我想你已經知道你需要什麼索引。

+0

我在那篇文章中沒有得到你的解決方案。你能否詳細說明與此案有關的一些例子? –

+0

更新了Edit-1下的響應。 –

+0

嘿,我想在這個方法中,你最終將Ram男孩映射到Ram是男孩等? ANyways,非常感謝幫助:) –