在Ruby on Rails中搜索的最佳选项是什么?

16
18个回答

17

Thinking Sphinx具有更简洁的语法来定义哪些字段和模型被索引。

UltraSphinx和Thinking Sphinx(最近)都具有超酷的功能,考虑了对象的地理接近程度。

UltraSphinx在加载模型方面存在烦人的问题(它不会加载整个Rails堆栈,因此可能会出现奇怪且难以诊断的错误,这些错误可以通过添加显式的require语句来处理)。

我们在新项目中使用Thinking Sphinx,在使用地理内容的项目中使用UltraSphinx。


2
好奇,如果两者都支持地理内容,为什么“在新项目中使用Thinking Sphinx,在使用地理内容的项目中使用UltraSphinx”? - Joshua Pinter

5

我现在正在经历这个过程,虽然我没有实际经验,但我花了很多时间研究所有的选项。到目前为止,我学到了以下内容:

  • *Sphinx - 速度和功能声誉良好,但Sphinx需要整数键,而我的模型使用GUID;ThinkingSphinx最近宣布支持地理空间
  • Acts_As_Solr - 被一个高流量网站的朋友推荐;原始创建者已停止开发,文档难以找到;需要Java servlet
  • Acts_As_Ferret - 看起来易于使用,但有很多批评者说它不稳定
  • 另外两个信息有限的是Acts_As_Indexed和Acts_As_Searchable

我有一张电子表格,记录了我试图记录所有这些选项的优缺点。如果有人有兴趣看到它和/或帮助我纠正它,请联系我。一旦我知道它是准确的,我会把它发布在某个地方。

如果您有普通的主键,我的建议是尝试UltraSphinx或Thinking Sphinx。基于良好的文档、特性集和项目活跃度,我将尝试Acts_As_Xapian。


5

4
我只在一个客户项目上使用过Ferret/acts_as_ferret组合(遗留决策)。我强烈建议首先看看其他选项。
aaf非常脆弱,如果您在配置中犯了错误或者由于某种原因击中了aaf的bug,它会使您的Rails应用程序停滞不前。
在这种情况下,任何触及索引模型的控制器操作都将完全失败并引发异常,而不是仅仅搜索功能失效。这是很糟糕的,知道吗?

1
如果有人仍然感兴趣,现在最新的使用方法是elasticsearch。有一些可用于它的宝石,例如tireelasticsearch-rails。它也像Solr一样基于Lucene,是基于Java的。实际上,Solr现在已经与这个项目集成了...

1

如果您像我一样使用共享主机服务(如Bluehost),则您的选项可能受限于提供商提供的内容。在我的情况下,我找不到一个好的可靠方法来启动和保持运行一个独立的服务器,例如Lucene或Solr。

因此,我选择了Xapian,并且它一直为我工作得很好。我研究了2个Rails插件:acts_as_xapian和xapian_fu。 第一个可以让您快速上手,但似乎已经不再维护了。我刚开始使用xapian_fu。


1

我正在使用acts_as_ferret。它很容易配置,通常速度也很快。内置的active record查找功能非常有用:您可以在搜索找到匹配记录后应用任何条件或连接其他模型。

与sphinx不同,当您添加新数据时,您不必重新索引所有记录。有after_save和after_update钩子,将插入您的新记录到ferret数据库中。这是我选择它的一个重要卖点之一。

当您确实需要批量索引数据时,ferret肯定比acts_as_sphinx慢(3倍)。我最终编写了自己的方法来重新索引模型,其速度与sphinx一样快--它基本上预加载来自DB的所有数据,而不是逐个记录地创建新索引。

ferret文档对于基础知识来说很好,但是一旦涉及到更复杂的搜索、排序和使用dRb服务器来托管远程索引,它就有点稀疏了。话虽如此,它感觉比acts_as_sphinx成熟得多,尽管我对sphinx的经验有限。


1

0

我也一直在寻找完美的解决方案。起初我选择了Thinking Sphinx,它运行良好。但由于我打算在Heroku上托管我的Web应用程序,唯一的选择是使用Solr。然而,最大的缺点是主要的acts_as_solr gem的开发似乎在2008年5月之后停止了。所以这对我来说太旧了。我刚刚发现了Sunspot作为一个先进的替代品,并且有最近的更新,所以我会考虑这个。

Heroku提供的另一个选择是选择基于Solr的托管索引服务器,名为Websolr。所需的gem websolr-acts_as_solr 也非常新。


0

我正在使用一个非常出色的替代方案。我正在使用jruby并直接与lucene交互。

过去我使用过acts_as_solr,但是遇到了一些问题。主要是每次AR保存都会进行同步调用。这不太糟糕,但在我的情况下,保存有时会导致对solr进行许多同步调用,并且偶尔需要比mongrel允许的更长时间,而我将得到一个mongrel超时异常(或类似的异常)。


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