2016-11-15 78 views
1

我有一個網絡應用程序,允許用戶上傳約2-3000字的文本文檔以及包含約50,000個短語(作爲字符串)的數據庫表。在單個文檔中查找短語

如何最有效地找出哪些短語出現在每個上傳的文檔中? (即有什麼比強制通過分別檢查每個短語強制它?)

Web應用程序流程應該是上傳後頁面加載時,應用程序知道它在該文檔中找到哪些短語。

理想情況下,我想要一個紅寶石解決方案,但對其他技術或數據結構或任何其他建議將是一個真正的幫助。

+2

您是否必須多次檢查? – Stefan

+0

在概念上,我覺得除了單獨檢查每個短語之外,別無他法。儘管(索引和其他)可以使用一些優化技巧來加快個別檢查速度。 –

+0

@斯蒂芬的問題是最相關的。如果你只需要做一次,那就蠻橫的,然後稱之爲一天。除此之外,另一個相關的問題是:您的文檔有多大?對於一個小文件(比如說莎士比亞的*錯誤喜劇*),最好的方法可能與大型文件(例如莎士比亞的完整作品)不同。 –

回答

0

我不知道該數據庫使用的是什麼,所以我只給一個MySQL解決方案:

require 'mysql2' 

content = File.read('/path/to/document.txt') 

client = Mysql2::Client.new(:host => "localhost", :username => "root") 

sql = "SELECT phrase FROM phrases ORDER BY LENGTH(phrase)" 

appeared = client.query(sql, as: :array, stream: true).each.with_object([]) do |row, array| 
    array << row[0] if content.gsub!(%r[#Regexp.escape(row[0])]i, '') 
end 

這樣做是爲了縮小各比賽結束後的內容,以便下一次搜索會更快。

免責聲明:未經測試。

+0

@SergioTulentsev謝謝。我只是把它改成'String#gsub!' – Aetherus