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

时间:2008-09-06 16:51:21

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

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

8 个答案:

答案 0 :(得分:19)

有几种选择,每种都有不同的优点和缺点。如果您想添加全文搜索,那么仔细研究一下并尝试一下,看看它在您的环境中对您有多好。

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

acts_as_tsearch为最近版本的PostgreSQL

提供了类似内置功能的包装器

对于其他数据库,您必须使用其他软件。

Lucene是一个用Java编写的流行搜索提供程序。您可以使用Solr通过其搜索服务器acts_as_solr使用Lucene和<{3}}。

如果您不想使用Java,则有一个名为Ferret的Lucene到Ruby的端口。使用acts_as_ferret插件添加对Rails的支持。

Xapian是另一个不错的选择,使用acts_as_xapian插件在Rails中受支持。

最后,我首选使用Sphinx插件Ultrasphinx。它非常快,并且有很多关于如何索引和搜索数据库的选项,但不再被主动维护。

Sphinx的另一个插件是Thinking Sphinx,它有很多正面feedback。使用Thinking Sphinx比使用Ultrasphinx更容易。我建议调查这两个插件,以确定哪个插件更适合您的项目。

答案 1 :(得分:7)

我可以推荐Sphinx。 Ryan Bates在使用Thinking Sphinx插件创建全文搜索解决方案方面表现出色screencast

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

仅供将来参考:Ultra Sphinx不再维护。思考狮身人面像是它的替代品。虽然它目前缺少一些功能,例如Ultra sphinx所具有的功能,但它可以弥补其他功能。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

两个主要选项,具体取决于您要做什么。

全文索引和{{Revista Semana}}

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

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

    MATCH() AGAINST()
  2. 使用该索引进行查询:

    add_index :table, :column, type: :fulltext
    

ElasticSearchSearchkick

如果您正在寻找一种功能强大的搜索索引解决方案,该解决方案可让您在快速查询的同时搜索任何记录中的任何列,请查看ElasticSearchSearchkick

ElasticSearch是索引和搜索引擎。

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

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

  1. 安装并启动ElasticSearch。

    where( "MATCH( column ) AGAINST( ? )", term )
    
  2. brew install elasticsearch brew services start elasticsearch 宝石添加到捆绑包中:

    searchkick

    bundle add searchkick --strict 选项只是告诉Bundler在您的Gemfile中使用确切的版本,我强烈建议这样做。

  3. --strict添加到您要建立索引的模型中:

    searchkick
  4. 为您的记录建立索引。

    class MyModel < ApplicationRecord
      searchkick
    end
    
  5. 搜索索引。

    MyModel.reindex