我开始从事一个需要在 Ruby 中进行全文搜索的项目,所以我自然而然地从 Solr + Sunspot 开始,但我无法让它工作。只是让它们连接起来很痛苦,然后试图弄清楚文档是否正确索引,找出运行时类路径,这样我就可以添加额外的分析器/标记器类,编辑 config.xml/schema.xml 等。 Solr numDocs 清楚说它收到并索引了它们,但我无法得到任何查询结果。几天后我就放弃了,这有点像配置地狱。
ElasticSearch + Tire 很容易启动并运行,我在一小时内就搞定了。
Lucene 只是一个 Java 搜索库,因此 Solr 被开发为一个全方位服务的搜索应用程序,但 Solr 仍然具有典型 Java webapp 的所有陷阱:过度复杂的 XML 配置、模式繁重、需要 XML 文档进行索引,需要一个 Java servlet 容器(Jetty 或 Tomcat),这对我来说成为太多故障点。
ElasticSearch 也是基于 Lucene,它有一个内置的 servlet 容器,所以就像一个守护进程一样运行,使用非常直接的 JSON + REST API,所以它非常适合测试并且更自然地适合 Ruby。它是无模式的,甚至无需编辑配置文件即可为我工作。一切都很顺利。
我真正需要的是中文搜索,而 ElasticSearch 已经将 Luecene 的 SmartChineseAnalyzer 打包为一个插件。如果您需要该级别的自定义,不确定自定义分析器/标记器链会有多困难。 ElasticSearch 和 Tire 的文档都是一流的。
轮胎(ElasticSearch 的 Ruby 库)
https://github.com/karmi/tire
你可以试试这个演示,它会安装一个 rails searchapp,下载 ElasticSearch 二进制文件并运行它,然后自动启动 Webrick。
$ rails new searchapp -m https://raw.github.com/karmi/tire/master/examples/rails-application-template.rb
在我的系统上,它抱怨没有 Javascript 引擎(Rails 3.2?默认情况下不再包含 thereubyracer gem),所以我不得不:
$ wget https://raw.github.com/karmi/tire/master/examples/rails-application-template.rb
$ nano rails-application-template.rb
在文件中添加 gem 'therubyracer'(查找 gem 'tire' 和 gem 'will_paginate'),然后...
$ rails new searchapp -m rails-application-template.rb
为了开发我自己的应用程序,我只是下载了 ElasticSearch tarball 并使用 -f 开关在前台运行(所以我可以通过 Ctrl-C 轻松停止它)
$ bin/elasticsearch -f
你可以安装 elelasticsearch-head 插件来获得一个 web 管理界面
https://github.com/mobz/elasticsearch-head
我还发现:如果您有一对多的关系模型,Tire 不会在搜索结果中为您解析它们,它只会返回一个平面集合。您的 has_many 和 belongs_to 关系将只是集合中的对象 ID,而不是完整的对象。