使用Elasticsearch进行Rails预测搜索表单建议

时间:2015-05-20 17:12:27

标签: ruby-on-rails elasticsearch

我希望在Google风格的下拉菜单中获得预测性搜索建议。我发现Elasticsearch将成为可能的方式(是吗?),但是在将其实现到我的Rails应用程序时遇到了一些问题(在Heroku上运行,但这不是问题 - 至少还没有:)。

我的应用非常简单。我有一个空间"的模型,视图和控制器,类似于校园中的房间或建筑物。数据库结构非常简单,它包含一个表("空格"),其中包含名称,代码,地址等详细信息。我希望其中任何一个都可以搜索。

我尝试通过本指南实施Elasticsearch:http://crestcode.com/deploying-elasticsearch-on-heroku-with-rails-4/

所以目前我已基本完成了第4步,但它不起作用。这些是我的代码片段,代表指南告诉我要做的部分(原谅不好的缩进):

视图/空间/ index.html.erb

<%= form_tag({controller: "spaces", action: "show"}, method: "get", id: 'searchbox', class: "nifty_form") do %>
<%= label_tag(:q, "Search for a building or a room:") %>
...
<%= text_field_tag(:q, params[:q]) %>

的routes.rb

resources :spaces
resource :space, only: [:show]

模型/ space.rb

require 'elasticsearch/model'
class Space < ActiveRecord::Base
    include Elasticsearch::Model
    include Elasticsearch::Model::Callbacks
end
Space.import

控制器/ spaces_controller.rb

def show
if params[:q].present?
  @space = Space.search(params[:q].split.join(' AND '))
else
  @space = []
end
end

错误是: Search error

非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

根据我在elasticsearch-model的gem github页面上发现的内容,问题是你在Elasticsearch Response对象上调用了name方法。你应该在结果文件上调用它。

文档说:

response = Article.search 'fox dogs'
response.results.first._source.title # => "Quick brown fox"

所以在你的情况下它将是:

response = Space.search(params[:q].split.join(' AND '))    
@space = response.results.first._source