【问题标题】:How do upload text document and is it possible to enable full text search on it?如何上传文本文档,是否可以在其上启用全文搜索?
【发布时间】:2013-07-23 07:15:59
【问题描述】:
我正在使用以下技术:
- JRuby 1.7.4
- Rails 3.2.13
- Ubuntu 13.04
- DB2 C-Express
- Torquebox 服务器 2.3.0
我的目标是制作一个实现以下功能的简单控制器:
- 上传文本文件(MS Word 格式、Open Office 或 Libre Office 格式)
- 对上传的文件执行全文搜索
- 在浏览器中将文本文件显示为 PDF
我已经搜索了可以帮助我实现这一目标的宝石,并且有以下问题:
- 存储文本文件的字段的列类型应该是什么。一般来说,我认为它应该是二进制类型。
- 是否可以使用Sunspot 执行全文搜索?正如我所读到的,它似乎适用于文本类型的字段,而不是二进制字段。
- 我读到了两个可以让我生成 PDF 的 gem。 Prawn gem 增加了更多的灵活性,PDFkit 可以从 HTML 页面生成 PDF。可以使用其中的任何一个来显示文本文件吗?我想我应该首先以某种方式在 HTML 中显示,然后使用 PDF gem。
有没有人做过这样的事情,你能指出我正确的方向吗?
【问题讨论】:
标签:
ruby
ruby-on-rails-3
pdf
full-text-search
jrubyonrails
【解决方案1】:
我还没有完成您要求的大部分工作,但我使用文本解析器将 MS Word 文档转换为 XML 文档的工作量很大。也许我至少可以让你朝着正确的方向开始。
我们使用一个名为POI, by Apache 的Java 库,它使DOC -> XML 转换成为一个简单的过程。由于您使用的是 JRuby,我想您将它集成到您的项目中会容易得多,因为我们使用的是 MRI Ruby。那是一个 PITA,因为我们必须包含许多桥梁和其他垃圾才能使用 .jar 文件。
就个人而言,我使用Carrierwave gem 来处理文件上传。上传文件并将它们附加到模型上非常简单。您只需使用 Carrierwave 生成器生成附加到模型中的字段的Uploader 类,将其配置为根据您的规范存储和处理文件,然后获利!文档很棒,但如果您需要,我很乐意为您提供帮助。如果您需要上传多文件,请在另一个 SO 帖子中I explained in detail about how I accomplished it。
希望有帮助!
【解决方案2】:
回答您的问题:
- 我会使用两列,一列二进制 (BLOB) 来存储原始文档(MS Word 或 LibreOffice)。这对于翻译成 PDF 很有用。然后是全文搜索的另一列;这将是 TEXT 类型,并且只包含纯文本。
- 我不会使用 gem 进行全文搜索,我宁愿使用 SQL 'LIKE' 关键字。
- 据我所知,虾是最好的。您也可以搜索是否某些 gem 直接将 MSWord 转换为 pdf 或 Libreoffice doc 转换为 PDF。
最后,Libreoffice 文本是简单的压缩档案,其中文本存储在 XML 文件中。要提取它:
content = `unzip -cq \"#{file_path}\" content.xml`
require 'nokogiri'
@nokogiri = Nokogiri::XML(content)
paragraphs = []
@nokogiri.xpath('//text:p').each do |t|
paragraphs << t.content
end
text = paragraphs.join ' '