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

12

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

8个回答

20
有几种可用的选项,每种选项都有不同的优缺点。如果您想添加全文搜索功能,最好对每个选项进行一些调查,并尝试在您的环境中测试其效果。
MySQL内置支持全文搜索。它具有在线支持,这意味着当新记录添加到数据库时,它们会自动索引并在搜索结果中可用。 文档 中有更多详细信息。 acts_as_tsearch为最近版本的PostgreSQL提供了类似内置功能的包装器。
对于其他数据库,您将需要使用其他软件。 Lucene是用Java编写的流行搜索提供程序。您可以使用acts_as_solr通过其搜索服务器Solr与Rails一起使用Lucene。
如果您不想使用Java,可以使用Ruby的Lucene端口Ferret。使用acts_as_ferret插件可支持Rails。 Xapian是另一个很好的选择,使用acts_as_xapian插件可在Rails中得到支持。
最后,我更喜欢使用SphinxUltrasphinx插件。它非常快速,并且有许多选项可以对数据库进行索引和搜索,但已不再积极维护。
Sphinx的另一个插件是Thinking Sphinx,拥有很多积极的feedback。使用Thinking Sphinx比使用Ultrasphinx更容易入手。建议研究这两个插件,以确定哪个更适合您的项目。

8
我可以推荐Sphinx。Ryan Bates有一个很好的屏幕录像,介绍如何使用Thinking Sphinx插件来创建全文搜索解决方案。请点击此处观看。

5

你可以使用 Ferret(它是用 Ruby 编写的 Lucene)。它使用 acts_as_ferret mixin 与 Rails 无缝集成。请查看 "如何将 Ferret 与 Rails 集成"。另一种选择是 Sphinx


Ferret曾经是一个很棒的宝石,但不幸的是,多年来它已经无法工作了。 - peter
嘿 @peter,你说得对。不过这个答案是在2008年写的。 :-) - marcospereira
我的评论是为了防止人们在当前日期尝试它,因为它不起作用。我一直在寻找替代品,昨天我发现了一个叫做“picky”的宝石,似乎可以胜任这项工作。 - peter

3

根据您的需求,有两种主要选择。

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

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

  1. Create the full text index in a migration file:

     add_index :table, :column, type: :fulltext
    
  2. Query using that index:

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

2) ElasticSearchSearchkick

如果你正在寻找一个全面的搜索索引解决方案,可以让你在任何记录中搜索任何列,同时还能保持极快的速度,请看一下ElasticSearchSearchkick

ElasticSearch是索引和搜索引擎。

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

Searchkick的README很好地解释了如何启动和微调设置,但这里是一个小片段:

  1. Install and start ElasticSearch.

     brew install elasticsearch
     brew services start elasticsearch
    
  2. Add searchkick gem to your bundle:

     bundle add searchkick --strict
    

    The --strict option just tells Bundler to use an exact version in your Gemfile, which I highly recommend.

  3. Add searchkick to a model you want to index:

     class MyModel < ApplicationRecord
       searchkick
     end
    
  4. Index your records.

     MyModel.reindex
    
  5. Search your index.

     matching_records = MyModel.search( "term" )
    

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

1
这取决于您使用的数据库。我建议使用Solr,因为它提供了许多不错的选项。缺点是您需要单独运行一个进程。我也用过Ferret,但发现在多线程访问索引方面不太稳定。我没有尝试过Sphinx,因为它只与MySQL和Postgres配合使用。

1

仅供参考:Ultra Sphinx已不再维护。Thinking Sphinx是它的替代品。虽然目前它缺少一些像Ultra Sphinx那样的摘录功能,但在其他方面弥补了这一点。


1

这是一个更全面的列表,但缺少每个插件的优缺点的一些细节; 这个问题也是如此。我想看到的是每个插件的列表,包括其优势和劣势的信息,并提供文档和教程的链接。 - sock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接