2011-03-01 26 views
1

我有一個名單/單詞塊列表,有大約500,000多個條目。數據的使用是爲了防止人們輸入這些詞作爲他們的用戶名或姓名。表結構很簡單:word_id, word, create_date實施用戶名黑名單

當用戶單擊提交時,我希望系統查找輸入的名稱是完全匹配還是word%匹配。

這是實現塊的唯一方法還是有更好的方法?我不喜歡在提交中查找這麼多行的想法,因爲它會減慢提交過程。

+0

您可以在* blur *而不是* submit *,imo上執行該操作..如果他接受的名稱不被接受,它至少會立即通知用戶,而不會使請求本身變得更慢。 – yoda 2011-03-01 01:28:55

+0

你也可以將這些單詞作爲json(或其他)緩存在一個文件中,這樣就不需要一直執行查詢(儘管對於那些條目數量,我不確定這是否是一個好主意所有) – yoda 2011-03-01 01:31:08

回答

1

考慮幾點:

  • 保持你的黑名單(業務邏輯)在應用程序檢查,並執行應用程序的比較。這就是它最重要的地方,你可能會有更豐富的編程語言來實現這個邏輯。

  • 將您的50萬條記錄加載到您的應用程序中,並將其存儲在某種緩存中。在每次註冊時,請對照緩存執行檢查。這將避免在每次註冊時擊中你的表格。它將全部在你的應用程序的內存中,並且性能會更好。

  • 確保myEnteredUserName在開始,結束和其他任何地方沒有列入黑名單的單詞。你的問題特別有一個開始檢查,但確保你不會錯過123_BadWord999

  • 緩存帶來了自己的一套新的挑戰;考慮每天n分鐘從數據庫重新加載,或者在特定的時間或事件。這將允許加載新的黑名單,舊的將被拋出。

+0

我迷失在第1點。黑名單檢查應用程序。與點擊數據庫並執行通配符select sql有什麼不同? – 2011-03-01 01:44:24

+0

@Dirk:你的應用在內存中會有這個黑名單 - 會話狀態或你有什麼。它不需要訪問數據庫,而是需要訪問緩存。每個註冊只需要進入緩存,而不是數據庫。不要使用SQL,而是使用更高級別和更豐富語言的應用程序。 – 2011-03-01 05:42:28

0

你不能做where 'loginName' = word%。 %只能用於文字字符串中,而不能用作列數據的一部分。

您需要說where 'logi' = word or 'login' = word or ...您將登錄名的子字符串與壞字進行比較。您需要測試每個長度介於最短和最長的壞詞之間的子字符串,包括(含)。

請確保您的表的word列有索引,並查看性能如何。

其他的方法可以做到這將是:

  • 使用Lucene的,這是很好的快速搜索文本,espacially如果你只需要知道你的字符串是否存在。當然Lucene在技術上可能不適合你的環境 - 它是一個Java庫。
  • 對每個不好的單詞進行哈希處理,並將它們記錄在內存中的一個bitset中 - 這將會小而快速地查找,並且您只需要到數據庫以確保一個正確的「假。