繁体   English   中英

如何在 Ruby on Rails 中进行全文搜索?

[英]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 集成”。 另一种选择是狮身人面像

两个主要选项,取决于您的追求。

1) 全文索引和MATCH() AGAINST()

如果您只是想对表中的几个文本列进行快速搜索,您可以简单地使用这些列的全文索引并在查询中使用MATCH() AGAINST()

  1. 在迁移文件中创建全文索引:

     add_index :table, :column, type: :fulltext
  2. 使用该索引查询:

     where( "MATCH( column ) AGAINST( ? )", term )

2) ElasticSearchSearchkick

如果您正在寻找一个完整的搜索索引解决方案,它允许您搜索任何记录中的任何列,同时仍然闪电般快速,请查看ElasticSearchSearchkick

ElasticSearch是索引和搜索引擎。

Searchkick是与 Rails 的集成库,它使索引和搜索记录变得非常容易。

Searchkick 的 README在解释如何启动和运行以及微调您的设置方面做得非常出色,但这里有一个小片段:

  1. 安装并启动 ElasticSearch。

     brew install elasticsearch brew services start elasticsearch
  2. searchkick gem 添加到您的包中:

     bundle add searchkick --strict

    --strict选项只是告诉 Bundler 在你的 Gemfile 中使用一个确切的版本,我强烈推荐。

  3. searchkick添加到要索引的模型:

     class MyModel < ApplicationRecord searchkick end
  4. 索引您的记录。

     MyModel.reindex
  5. 搜索您的索引。

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM