2016-11-15 28 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