【发布时间】:2010-09-08 00:57:33
【问题描述】:
我想在我的 Ruby on Rails 应用程序中对数据进行全文搜索。有哪些选择?
【问题讨论】:
标签: ruby-on-rails full-text-search
我想在我的 Ruby on Rails 应用程序中对数据进行全文搜索。有哪些选择?
【问题讨论】:
标签: ruby-on-rails full-text-search
您可以使用 Ferret(它是用 Ruby 编写的 Lucene)。它使用acts_as_ferret mixin 与Rails 无缝集成。看看“How to Integrate Ferret With Rails”。另一种选择是Sphinx。
【讨论】:
我可以推荐斯芬克斯。 Ryan Bates 有一个很棒的screencast 使用 Thinking Sphinx 插件创建全文搜索解决方案。
【讨论】:
有多种选择,每种都有不同的优势和劣势。如果您想添加全文搜索,谨慎的做法是对每一项进行一些调查并尝试一下,看看它在您的环境中的效果如何。
MySQL 具有对全文搜索的内置支持。它具有在线支持,这意味着当将新记录添加到数据库时,它们会被自动索引并在搜索结果中可用。 documentation 有更多详细信息。
acts_as_tsearch 为PostgreSQL 的最新版本提供类似内置功能的包装器
对于其他数据库,您将不得不使用其他软件。
Lucene 是一个用 Java 编写的流行搜索提供程序。您可以使用 Lucene 通过其搜索服务器 Solr 和 Rails 使用 acts_as_solr。
如果您不想使用 Java,有一个 Lucene 到 Ruby 的端口,称为 Ferret。使用 acts_as_ferret 插件添加了对 Rails 的支持。
Xapian 是另一个不错的选择,在 Rails 中使用 acts_as_xapian 插件支持。
最后,我的首选是使用Ultrasphinx 插件的Sphinx。它速度极快,并且有许多关于如何索引和搜索数据库的选项,但不再积极维护。
Sphinx 的另一个插件是Thinking Sphinx,它有很多积极的feedback。使用 Thinking Sphinx 比 Ultrasphinx 更容易上手。我建议调查这两个插件以确定哪个更适合您的项目。
【讨论】:
我一直在编译list of the various Ruby on Rails search options in this other question。我不确定如何或是否将我们的问题结合起来。
【讨论】:
这取决于您使用的数据库。我会推荐使用 Solr,因为它提供了很多不错的选择。缺点是你必须为它运行一个单独的进程。我也使用过 Ferret,但发现它在多线程访问索引方面不太稳定。我没有尝试过 Sphinx,因为它只适用于 MySQL 和 Postgres。
【讨论】:
仅供参考:Ultra Sphinx 已不再维护。认为狮身人面像是它的替代品。尽管它目前缺少一些功能,例如 Ultra sphinx 的摘录,但它在其他功能中弥补了这一点。
【讨论】:
我会推荐acts_as_ferret,因为我在工作中将它用于Scrumpad 项目。索引可以作为一个单独的过程完成,以确保在重新索引时我们仍然可以使用我们的应用程序。这可以减少网站的停机时间。搜索也快得多。您可以一次搜索多个模型,并按您喜欢的字段对结果进行排序。
【讨论】:
MATCH() AGAINST()。如果您只是想对表中的几个文本列进行快速搜索,您可以简单地使用这些列的全文索引并在查询中使用 MATCH() AGAINST()。
在迁移文件中创建全文索引:
add_index :table, :column, type: :fulltext
使用该索引查询:
where( "MATCH( column ) AGAINST( ? )", term )
如果您正在寻找一个成熟的搜索索引解决方案,它允许您搜索任何记录中的任何列,同时仍保持闪电般的速度,请查看ElasticSearch 和Searchkick。
ElasticSearch 是索引和搜索引擎。
Searchkick 是与 Rails 的集成库,可让您轻松索引记录并进行搜索。
Searchkick's README 在解释如何启动和运行以及微调您的设置方面做得非常出色,但这里有一点 sn-p:
安装并启动 ElasticSearch。
brew install elasticsearch
brew services start elasticsearch
将searchkick gem 添加到您的捆绑包中:
bundle add searchkick --strict
--strict 选项只是告诉 Bundler 在您的 Gemfile 中使用准确的版本,我强烈建议这样做。
将searchkick 添加到要索引的模型中:
class MyModel < ApplicationRecord
searchkick
end
索引您的记录。
MyModel.reindex
搜索您的索引。
matching_records = MyModel.search( "term" )
【讨论】: