我想在Ruby on Rails应用程序中对数据进行全文搜索。有哪些选择?
答案 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()
。
在迁移文件中创建全文索引:
MATCH() AGAINST()
使用该索引进行查询:
add_index :table, :column, type: :fulltext
如果您正在寻找一种功能强大的搜索索引解决方案,该解决方案可让您在快速查询的同时搜索任何记录中的任何列,请查看ElasticSearch和Searchkick。
ElasticSearch是索引和搜索引擎。
Searchkick是带有Rails的集成库,它使索引记录和搜索变得非常容易。
Searchkick's README在解释如何启动和运行以及微调您的设置方面做得非常出色,但这是一个小片段:
安装并启动ElasticSearch。
where( "MATCH( column ) AGAINST( ? )", term )
将brew install elasticsearch
brew services start elasticsearch
宝石添加到捆绑包中:
searchkick
bundle add searchkick --strict
选项只是告诉Bundler在您的Gemfile中使用确切的版本,我强烈建议这样做。
将--strict
添加到您要建立索引的模型中:
searchkick
为您的记录建立索引。
class MyModel < ApplicationRecord
searchkick
end
搜索索引。
MyModel.reindex