我有一個網絡應用程序,允許用戶上傳約2-3000字的文本文檔以及包含約50,000個短語(作爲字符串)的數據庫表。在單個文檔中查找短語
如何最有效地找出哪些短語出現在每個上傳的文檔中? (即有什麼比強制通過分別檢查每個短語強制它?)
Web應用程序流程應該是上傳後頁面加載時,應用程序知道它在該文檔中找到哪些短語。
理想情況下,我想要一個紅寶石解決方案,但對其他技術或數據結構或任何其他建議將是一個真正的幫助。
我有一個網絡應用程序,允許用戶上傳約2-3000字的文本文檔以及包含約50,000個短語(作爲字符串)的數據庫表。在單個文檔中查找短語
如何最有效地找出哪些短語出現在每個上傳的文檔中? (即有什麼比強制通過分別檢查每個短語強制它?)
Web應用程序流程應該是上傳後頁面加載時,應用程序知道它在該文檔中找到哪些短語。
理想情況下,我想要一個紅寶石解決方案,但對其他技術或數據結構或任何其他建議將是一個真正的幫助。
我不知道該數據庫使用的是什麼,所以我只給一個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
這樣做是爲了縮小各比賽結束後的內容,以便下一次搜索會更快。
免責聲明:未經測試。
@SergioTulentsev謝謝。我只是把它改成'String#gsub!' – Aetherus
您是否必須多次檢查? – Stefan
在概念上,我覺得除了單獨檢查每個短語之外,別無他法。儘管(索引和其他)可以使用一些優化技巧來加快個別檢查速度。 –
@斯蒂芬的問題是最相關的。如果你只需要做一次,那就蠻橫的,然後稱之爲一天。除此之外,另一個相關的問題是:您的文檔有多大?對於一個小文件(比如說莎士比亞的*錯誤喜劇*),最好的方法可能與大型文件(例如莎士比亞的完整作品)不同。 –