【问题标题】:How do I do full-text searching in Ruby on Rails?如何在 Ruby on Rails 中进行全文搜索?
【发布时间】:2010-09-08 00:57:33
【问题描述】:

我想在我的 Ruby on Rails 应用程序中对数据进行全文搜索。有哪些选择?

【问题讨论】:

    标签: ruby-on-rails full-text-search


    【解决方案1】:

    您可以使用 Ferret(它是用 Ruby 编写的 Lucene)。它使用acts_as_ferret mixin 与Rails 无缝集成。看看“How to Integrate Ferret With Rails”。另一种选择是Sphinx

    【讨论】:

    • 雪貂是一颗很棒的宝石,但不幸的是,多年来它已经不再工作了
    • 嘿@peter,你是对的。不过,这个答案是在 2008 年写的。 :-)
    • 我的评论是为了防止人们在这个日期尝试它,因为它不会起作用,我一直在寻找替代品,就在昨天我发现似乎很挑剔的宝石工作
    【解决方案2】:

    我可以推荐斯芬克斯。 Ryan Bates 有一个很棒的screencast 使用 Thinking Sphinx 插件创建全文搜索解决方案。

    【讨论】:

      【解决方案3】:

      有多种选择,每种都有不同的优势和劣势。如果您想添加全文搜索,谨慎的做法是对每一项进行一些调查并尝试一下,看看它在您的环境中的效果如何。

      MySQL 具有对全文搜索的内置支持。它具有在线支持,这意味着当将新记录添加到数据库时,它们会被自动索引并在搜索结果中可用。 documentation 有更多详细信息。

      acts_as_tsearchPostgreSQL 的最新版本提供类似内置功能的包装器

      对于其他数据库,您将不得不使用其他软件。

      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 更容易上手。我建议调查这两个插件以确定哪个更适合您的项目。

      【讨论】:

        【解决方案4】:

        我一直在编译list of the various Ruby on Rails search options in this other question。我不确定如何或是否将我们的问题结合起来。

        【讨论】:

        • 这是一个更全面的列表,但缺少关于每个优点和缺点的一些细节;这个问题也是。我希望看到的是每个插件的列表,其中包含有关其优点和缺点的信息,以及文档和教程的链接。
        【解决方案5】:

        这取决于您使用的数据库。我会推荐使用 Solr,因为它提供了很多不错的选择。缺点是你必须为它运行一个单独的进程。我也使用过 Ferret,但发现它在多线程访问索引方面不太稳定。我没有尝试过 Sphinx,因为它只适用于 MySQL 和 Postgres。

        【讨论】:

          【解决方案6】:

          仅供参考:Ultra Sphinx 已不再维护。认为狮身人面像是它的替代品。尽管它目前缺少一些功能,例如 Ultra sphinx 的摘录,但它在其他功能中弥补了这一点。

          【讨论】:

            【解决方案7】:

            我会推荐acts_as_ferret,因为我在工作中将它用于Scrumpad 项目。索引可以作为一个单独的过程完成,以确保在重新索引时我们仍然可以使用我们的应用程序。这可以减少网站的停机时间。搜索也快得多。您可以一次搜索多个模型,并按您喜欢的字段对结果进行排序。

            【讨论】:

              【解决方案8】:

              两个主要选项,取决于您的目标。

              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's README 在解释如何启动和运行以及微调您的设置方面做得非常出色,但这里有一点 sn-p:

              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" )
                

              【讨论】:

                猜你喜欢
                • 2011-03-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-05
                • 1970-01-01
                • 2011-05-29
                • 1970-01-01
                • 2014-06-06
                相关资源
                最近更新 更多