我想在我的 Ruby on Rails 应用程序中对数据进行全文搜索。存在哪些选择?
8 回答
有几个选项可用,每个选项都有不同的优点和缺点。如果您想添加全文搜索,谨慎的做法是对每一项进行调查并尝试一下,看看它在您的环境中对您的效果如何。
MySQL 具有对全文搜索的内置支持。它具有在线支持,这意味着当将新记录添加到数据库时,它们会被自动索引并在搜索结果中可用。该文档有更多详细信息。
acts_as_tsearch
为最新版本的PostgreSQL提供类似内置功能的包装器
对于其他数据库,您将不得不使用其他软件。
Lucene是一个用 Java 编写的流行搜索提供程序。您可以通过其搜索服务器Solr使用 Lucene和 Rails,使用acts_as_solr
.
如果您不想使用 Java,有一个 Lucene 到 Ruby 的端口,称为Ferret。acts_as_ferret
使用插件添加了对 Rails 的支持。
Xapian是另一个不错的选择,并且在 Rails 中使用该acts_as_xapian
插件支持。
最后,我的首选是使用Ultrasphinx插件的Sphinx 。它速度极快,并且有许多关于如何索引和搜索数据库的选项,但不再积极维护。
Sphinx 的另一个插件是Thinking Sphinx,它有很多积极的反馈。使用 Thinking Sphinx 比 Ultrasphinx 更容易上手。我建议调查这两个插件以确定哪个更适合您的项目。
我可以推荐斯芬克斯。Ryan Bates 有一个关于使用 Thinking Sphinx 插件创建全文搜索解决方案的精彩截屏视频。
您可以使用 Ferret(它是用 Ruby 编写的 Lucene)。它使用acts_as_ferret mixin 与Rails 无缝集成。看看“如何将 Ferret 与 Rails 集成”。另一种选择是Sphinx。
两个主要选项,取决于你的追求。
1)全文索引和MATCH() AGAINST()
。
如果您只是想对表中的几个文本列进行快速搜索,您可以简单地使用这些列的全文索引并MATCH() AGAINST()
在查询中使用。
在迁移文件中创建全文索引:
add_index :table, :column, type: :fulltext
使用该索引查询:
where( "MATCH( column ) AGAINST( ? )", term )
2) ElasticSearch和Searchkick
如果您正在寻找一个完整的搜索索引解决方案,它允许您搜索任何记录中的任何列,同时仍然快速,请查看ElasticSearch和Searchkick。
ElasticSearch是索引和搜索引擎。
Searchkick是与 Rails 的集成库,可以很容易地为您的记录建立索引并进行搜索。
Searchkick 的自述文件在解释如何启动和运行以及微调您的设置方面做得非常出色,但这里有一个小片段:
安装并启动 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" )
在另一个问题中,我一直在编译各种 Ruby on Rails 搜索选项的列表。我不确定如何或是否将我们的问题结合起来。
这取决于您使用的数据库。我会推荐使用 Solr,因为它提供了很多不错的选择。缺点是你必须为它运行一个单独的进程。我也使用过 Ferret,但发现它在多线程访问索引方面不太稳定。我没有尝试过 Sphinx,因为它只适用于 MySQL 和 Postgres。
仅供参考:Ultra Sphinx 不再被维护。认为狮身人面像是它的替代品。尽管它目前缺少一些功能,例如 Ultra sphinx 的摘录,但它在其他功能中弥补了这一点。
我会推荐acts_as_ferret,因为我在工作中将它用于Scrumpad 项目。索引可以作为一个单独的过程完成,以确保在重新索引时我们仍然可以使用我们的应用程序。这可以减少网站的停机时间。搜索也快得多。您可以一次搜索多个模型,并按您喜欢的字段对结果进行排序。