[英]How do I do full-text searching in Ruby on Rails?
我想在我的 Ruby on Rails 应用程序中对数据进行全文搜索。 有哪些选择?
有多种选择,每种都有不同的优势和劣势。 如果您想添加全文搜索,明智的做法是对每个搜索进行一点调查并尝试一下,看看它在您的环境中是否适合您。
MySQL 内置了对全文搜索的支持。 它具有在线支持,这意味着当新记录被添加到数据库时,它们会被自动编入索引并在搜索结果中可用。 文档有更多细节。
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 ,它有很多积极的反馈。 使用 Thinking Sphinx 比 Ultrasphinx 更容易上手。 我建议调查这两个插件以确定哪个更适合您的项目。
我可以推荐斯芬克斯。 Ryan Bates 有一个关于使用 Thinking Sphinx 插件创建全文搜索解决方案的精彩截屏视频。
您可以使用 Ferret(这是用 Ruby 编写的 Lucene)。 它使用acts_as_ferret mixin 与Rails 无缝集成。 看看“ 如何将 Ferret 与 Rails 集成”。 另一种选择是狮身人面像。
MATCH() AGAINST()
。 如果您只是想对表中的几个文本列进行快速搜索,您可以简单地使用这些列的全文索引并在查询中使用MATCH() AGAINST()
。
在迁移文件中创建全文索引:
add_index :table, :column, type: :fulltext
使用该索引查询:
where( "MATCH( column ) AGAINST( ? )", term )
如果您正在寻找一个完整的搜索索引解决方案,它允许您搜索任何记录中的任何列,同时仍然闪电般快速,请查看ElasticSearch和Searchkick 。
ElasticSearch是索引和搜索引擎。
Searchkick是与 Rails 的集成库,它使索引和搜索记录变得非常容易。
Searchkick 的 README在解释如何启动和运行以及微调您的设置方面做得非常出色,但这里有一个小片段:
安装并启动 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" )
这取决于您使用的数据库。 我建议使用 Solr,因为它提供了很多不错的选择。 缺点是你必须为它运行一个单独的进程。 我也使用过 Ferret,但发现它在多线程访问索引方面不太稳定。 我没有尝试过 Sphinx,因为它只适用于 MySQL 和 Postgres。
我会推荐acts_as_ferret,因为我将它用于工作中的Scrumpad 项目。 索引可以作为一个单独的过程完成,以确保在重新索引时我们仍然可以使用我们的应用程序。 这可以减少网站的停机时间。 此外,搜索速度要快得多。 您可以一次搜索多个模型,并按您喜欢的字段对结果进行排序。
仅供参考:Ultra Sphinx 不再维护。 思维狮身人面像是它的替代品。 虽然它现在缺少一些像 Ultra sphinx 所具有的摘录这样的功能,但它在其他功能中弥补了这一点。
我一直在另一个问题中编制各种 Ruby on Rails 搜索选项的列表。 我不确定如何,或者是否将我们的问题结合起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.