在Ruby on Rails中进行搜索的最佳选择是什么?
有几个插件选项可用于在Ruby on Rails应用程序中构建搜索引擎。其中哪一个最好?
- 思维狮身人面像
- UltraSphinx
- 括约肌
- actions_as_sphinx
- acts_as_ferret
- 雪貂
- acts_as_xapian
- actions_as_solr
- 超级埃斯特里尔
解决方案
回答
我使用了Think Sphinx,它看起来还不错,但是我没有时间评估所有选项。
回答
我推荐Thinking Sphinx。我认为这是最快的选择。
回答
我使用过Ferret,并且可以很好地用于我的目的,但是我还没有评估其他选项。
回答
Think Sphinx具有更简洁的语法,可以定义对哪些字段和哪些模型建立索引。
UltraSphinx和Think Sphinx(最近)都具有超酷功能,该功能考虑了对象的地理邻近性。
UltraSphinx在加载模型方面存在烦人的问题(它不会加载整个Rails堆栈,因此我们可能会感到奇怪并且难以诊断错误,这可以通过添加显式的require
语句来解决)。
我们在新项目中使用Thinking Sphinx,在使用地理内容的项目中使用UltraSphinx。
回答
我仅在客户端项目上使用了Ferret / acts_as_ferret组合(旧式决策)。我强烈建议我们先查看其他选项。
aaf非常脆弱,如果我们在配置中犯了错误或者由于某种原因遇到了aaf中的错误,可能会使Rails应用程序停止运转。
在这种情况下,任何与索引模型相关的控制器动作都将完全失败并引发异常,而不是简单地使搜索功能崩溃。嗯,哪个是baaad?
回答
我没有尝试过的选项是基于C ++的Xapian
回答
我使用acts_as_xapian插件。我遵循了本教程:
http://locomotivation.com/2008/07/23/simple-ruby-on-rails-full-text-search-using-xapian
效果很好。
回答
我的一个朋友使用的一个可靠的选择是Solr,它是使用原始的基于Java的Lucene的搜索引擎。为了与Rails一起使用,当然有一个acts_as插件acts_as_solr。
他最近在蒙特利尔的Rails上展示了该组合,并在博客上对如何使用acts_as_solr进行了详尽而全面的概述。
它显然也很好地支持法国口音。
回答
我们使用的是继承的http://hyperestraier.sourceforge.net/。尚未研究其他引擎,但是hyperestraier提供了所有必要的功能。但是,设置搜索索引很复杂。可能更简单的选项可用。
回答
前面已经在这里问了这个问题,提供了更详细的答案。
回答
我现在正在经历这个确切的过程,因此尽管我没有实际经验,但我花了很多时间研究所有选项。到目前为止,这是我学到的东西:
- 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。
回答
我正在使用acts_as_ferret。它易于配置,而且通常速度很快。内置的活动记录查找功能非常有用:搜索找到匹配的记录后,我们可以应用任何条件或者加入其他模型。
与狮身人面像不同,添加新数据时不必重新索引所有记录。有after_save和after_update钩子将新记录插入到雪貂数据库中。这对我来说是最大的卖点之一。
当我们必须对数据进行大规模索引时,雪貂肯定比acts_as_sphinx慢(3倍)。我最终编写了自己的方法来重新索引模型,该方法的运行速度与sphinx一样快-它基本上是从数据库中预加载所有数据,而不是逐条记录地创建新索引。
雪貂文档对基础知识很有帮助,但是一旦我们进入更复杂的搜索,排序并使用dRb服务器托管远程索引,它就会变得很少。话虽这么说,尽管我对狮身人面像的经验有限,但它感觉比acts_as_sphinx成熟得多。
回答
这取决于我们使用的数据库。我建议使用Solr,因为它为模糊搜索提供了很多不错的选择,并且具有出色的查询解析器。缺点是我们必须为此运行一个单独的过程。我也使用过Ferret,但是发现它在对索引的多线程访问方面不太稳定。我没有尝试过Sphinx,因为它仅适用于MySQL和Postgres。
回答
我使用的是另一个选项,效果非常好。我正在使用jruby并直接与lucene交谈。
我过去曾经使用acts_as_solr并遇到了一些问题。主要是它为每个AR保存进行一次同步调用。这还算不错,但是在我的情况下,保存有时会导致许多同步调用solr,有时所需的时间比mongrel允许的时间长,而我会收到mongrel超时异常(或者类似的东西)
回答
认为Sphinx比似乎被遗弃的Ultrasphinx更好,但是Xapian的引擎比Sphinx更强大,并且更易于实现实时搜索。
回答
我推荐acts_as_ferret。但是,尽管困难的部分是要使其在服务器中成功启动并运行,但是一旦完成,我们几乎不会遇到任何问题,因为雪貂服务器将作为单独的后台进程运行,以便在每次有新更新时都更新索引。而且,它在与我们的apache杂种中的工作非常出色。
回答
我也一直在寻找完美的解决方案。一开始,我选择了Think Sphinx,效果很好。但是由于我打算在Heroku上托管我的Web应用程序,因此唯一的选择是使用Solr。但是,最大的缺点是,主要的acts_as_solr宝石的开发似乎在2008年5月之后停止了。我刚刚发现Sunspot是一种高级替代产品,并且具有最新更新,因此我将考虑使用它。
Heroku提供的另一种选择是使用基于Solr的托管索引服务器,即Websolr。幸运的是,所需的gem websolr-acts_as_solr也非常最新。
回答
如果我们正在使用像我这样的共享托管服务(Bluehost),则选择可能仅限于提供商提供的服务。就我而言,我找不到启动和保持独立服务器(例如Lucene或者Solr)运行的良好且可靠的方法。
因此,我和Xapian一起去,对我来说一直很好。我研究了2个Rails插件:acts_as_xapian和xapian_fu。
第一个可以使我们快速入门,但是似乎不再需要维护了。我刚刚开始使用xapian_fu。