在 Ruby on Rails 中搜索的最佳选择是啥? [关闭]
Posted
技术标签:
【中文标题】在 Ruby on Rails 中搜索的最佳选择是啥? [关闭]【英文标题】:What's the best option for searching in Ruby on Rails? [closed]在 Ruby on Rails 中搜索的最佳选择是什么? [关闭] 【发布时间】:2010-09-09 13:36:36 【问题描述】:有几个插件选项可用于将搜索引擎构建到您的 Ruby on Rails 应用程序中。哪个是最好的?
Thinking Sphinx UltraSphinx Sphincter acts_as_sphinx acts_as_ferret Ferret acts_as_xapian acts_as_solr Hyper Estraier【问题讨论】:
【参考方案1】:如果有人仍然感兴趣,现在最新使用的是 elasticsearch。有可用的 gem,例如 tire 或 elasticsearch-rails。它也像 Solr 一样基于 Lucene,基于 Java。 Solr 现在其实已经和这个项目集成了……
【讨论】:
【参考方案2】:如果您使用像我这样的共享托管服务 (Bluehost),您的选择可能仅限于提供商提供的服务。就我而言,我找不到一种好的可靠方法来启动和保持单独的服务器运行,例如 Lucene 或 Solr。
因此,我选择了 Xapian,它对我来说效果很好。我研究过 2 个 Rails 插件:acts_as_xapian 和 xapian_fu。 第一个会让你快速上手,但它似乎不再被维护了。我刚刚开始使用 xapian_fu。
【讨论】:
【参考方案3】:我也一直在寻找完美的解决方案。起初我选择了 Thinking Sphinx,效果很好。但由于我打算在Heroku 上托管我的webapp,唯一的选择是使用Solr。然而,最大的缺点是主要的acts_as_solr gem 的开发似乎在 2008 年 5 月之后就停止了。所以这对我来说太旧了。我刚刚发现 Sunspot 是一种高级替代方案,并且最近有更新,所以我将考虑使用它。
Heroku 提供的另一个选项是使用基于 Solr 的托管索引服务器,名为 Websolr。幸运的是,所需的 gem websolr-acts_as_solr 也是最新的。
【讨论】:
【参考方案4】:我推荐acts_as_ferret。但是,虽然困难的部分是让它在您的服务器中成功启动并运行,但一旦完成,您几乎没有任何问题,因为 ferret 服务器将作为单独的后台进程运行,以在每次有任何新更新时更新您的索引。此外,它在 mongrel 中与我们的 apache 一起工作得很好。
【讨论】:
【参考方案5】:Thinking Sphinx 比 Ultrasphinx 更好,后者似乎已被废弃,但总的来说,Xapian 的引擎比 Sphinx 更强大,并且更容易实现实时搜索。
【讨论】:
【参考方案6】:我使用了一个不同的选项,效果非常好。我正在使用 jruby 并直接与 lucene 交谈。
我过去使用过acts_as_solr 并遇到了一些问题。主要是对每个 AR 保存进行同步调用。这还不错,但在我的情况下,保存有时会导致对 solr 的许多同步调用,并且有时会花费比 mongrel 允许的时间更长的时间,并且我会得到一个 mongrel 超时异常(或类似的东西)
【讨论】:
【参考方案7】:Thinking Sphinx 有更简洁的语法来定义哪些字段和哪些模型被索引。
UltraSphinx 和 Thinking Sphinx(最近)都具有超酷的功能,该功能考虑了对象的地理邻近性。
UltraSphinx 在加载模型方面存在烦人的问题(它不会加载整个 Rails 堆栈,因此您可能会感到奇怪且难以诊断错误,这些错误可通过添加显式 require
语句来处理)。
我们在新项目中使用 Thinking Sphinx,在使用地理内容的项目中使用 UltraSphinx。
【讨论】:
很好奇,如果两者都支持地理内容,为什么“在新项目上使用 Thinking Sphinx,在使用地理内容的项目上使用 UltraSphinx”?【参考方案8】:这取决于您使用的数据库。我会推荐使用 Solr,因为它为模糊搜索提供了很多不错的选项,并且具有出色的查询解析器。缺点是你必须为它运行一个单独的进程。我也使用过 Ferret,但发现它在多线程访问索引方面不太稳定。我没有尝试过 Sphinx,因为它只适用于 mysql 和 Postgres。
【讨论】:
【参考方案9】:我正在使用acts_as_ferret。它易于配置并且通常速度很快。内置的活动记录查找功能非常有用:您可以在搜索找到匹配记录后应用任何条件或加入其他模型。
与 sphinx 不同,您无需在添加新数据时重新索引所有记录。有 after_save 和 after_update 钩子可以将你的新记录插入到 ferret 数据库中。这对我来说是一大卖点。
当您必须对数据进行海量索引时,ferret 肯定比acts_as_sphinx 慢(3 倍)。我最终编写了自己的方法来重新索引模型,它的工作速度与 sphinx 一样快——它基本上是从数据库中预加载所有数据,而不是逐条记录来创建新索引。
ferret 文档对基础知识很有用,但是一旦您进行更复杂的搜索、排序和使用 dRb 服务器托管远程索引,它就会有点稀疏。话虽这么说,但感觉它比acts_as_sphinx成熟得多,虽然我对sphinx的经验有限。
【讨论】:
【参考方案10】:我现在正在经历这个确切的过程,所以虽然我没有实际经验,但我已经花了很多时间研究所有选项。以下是我到目前为止所学到的:
*Sphinx - 在速度和功能方面享有盛誉,但 Sphinx 需要整数键,而我的模型使用 GUID; ThinkingSphinx 最近宣布支持 GeoSpatial Acts_As_Solr - 由拥有大量站点的朋友推荐;原始创作者已经停止工作,并且很难找到文档;需要 Java servlet Acts_As_Ferret - 看起来很容易使用,但很多批评者说它不稳定 另外两个信息有限的是 Acts_As_Indexed 和 Acts_As_Searchable我有一个电子表格,试图记录所有这些的优点和缺点。如果有人有兴趣看到它和/或帮助我纠正它,请与我联系。一旦我知道它的准确性,我会在某个地方发布它。
如果您有普通的主键,我的建议是尝试 UltraSphinx 或 Thinking Sphinx。我将根据良好的文档、功能集以及项目的活跃程度来尝试 Acts_As_Xapian。
【讨论】:
【参考方案11】:我只在一个客户项目中使用了 Ferret/acts_as_ferret 组合(遗留决策)。我强烈建议您先查看其他选项。
aaf 非常脆弱,如果您在配置中犯了错误或由于某种原因在 aaf 中遇到错误,它可能会使您的 Rails 应用程序突然停止。
在这种情况下,不是简单地让搜索功能失效,任何触及索引模型的控制器操作都将完全失败并引发异常。哪个是baaad,hmkay?
【讨论】:
【参考方案12】:这个问题之前here 已经提出了更详细的答案。
【讨论】:
【参考方案13】:我们使用的是http://hyperestraier.sourceforge.net/,它是继承而来的。没有研究过其他引擎,但 hyperestraier 提供了所有必要的钩子。但是设置搜索索引很复杂。可能有更简单的选择。
【讨论】:
【参考方案14】:我的一个朋友使用的一个可靠选项是Solr,这是一个使用原始基于 Java 的 Lucene 的搜索引擎。要在 Rails 中使用它,当然有一个 act_as 插件,acts_as_solr。
他最近在 Montreal on Rails 上介绍了该组合,并对 how to use acts_as_solr on his blog 进行了很好而全面的概述。
它显然也很好地支持法语口音。
【讨论】:
【参考方案15】:我使用 acts_as_xapian 插件。我遵循了本教程:
http://locomotivation.com/2008/07/23/simple-ruby-on-rails-full-text-search-using-xapian
效果很好。
【讨论】:
【参考方案16】:我没有尝试过的一个选项是基于 C++ 的Xapian
【讨论】:
【参考方案17】:我使用过 Ferret,它对我的目的很有效,但我没有评估其他选项。
【讨论】:
【参考方案18】:我推荐 Thinking Sphinx。我认为这是最快的选择。
【讨论】:
【参考方案19】:我用过 Thinking Sphinx,它看起来不错,但我没有时间评估所有选项。
【讨论】:
以上是关于在 Ruby on Rails 中搜索的最佳选择是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 Ruby on Rails 中使用 ActionCable 更新多个 div 的最佳实践是啥?
在 Ruby on Rails 中测试模型实例是不是为“空”的最佳方法是啥?