【问题标题】:searchkick/elasticsearch set up autocomplete with multiple attributessearchkick/elasticsearch 使用多个属性设置自动完成
【发布时间】:2014-12-18 13:26:26
【问题描述】:

我已经使用 searchkick gem 设置了我的应用程序,并且正在为我的 Presenters 索引开发自动完成功能。我的问题是我正在搜索多个字段(名字和姓氏),虽然我可以通过这两个字段搜索演示者 - 例如,如果我有演示者“Jennifer Hall”,我可以输入“Jennifer”或“Hall” ' 并且名称 'Jennifer Hall' 将出现在自动完成下拉菜单中,但如果我输入 'Jennifer' (一旦我添加了空格),名称就会消失并且没有更多建议。我的问题是如何解决这个问题?

我的代码

我已按照本教程进行操作: Adding search and autocomplete to a Rails app with Elasticsearch

presenter.rb:

class Presenter < ActiveRecord::Base
  searchkick autocomplete: ['first_name', 'last_name'],
             suggest: ['first_name', 'last_name']

  ...
end

presenters_controller.rb:

class PresentersController < ApplicationController
  def index
    if params[:query].present?
      @presenters = Presenter.search(params[:query],
                                     fields: [:first_name, :last_name],
                                     page: params[:page])
    else
      @presenters = Presenter.all.page params[:page]
    end
  end

  def autocomplete
    render json: Presenter.search(params[:query],
                 autocomplete: true,
                 fields: [:first_name, :last_name],
                 limit: 10).map { |presenter|
                   presenter.first_name + " " + presenter.last_name
                 }
  end

  ...
end

我得到了 .map{ |presenter|等 } 来自这里的想法:

how do i map multiple attributes in rails with searchkick gem

但是,当我完全按照解决方案进行操作时,我的建议名称下拉列表中只有“未定义”。将其更改为presenter.first_name + " " + presenter.last_name 使其全名显示在下拉列表中。

routes.rb:

  resources :presenters, :only => [:index, :show] do
    collection do 
      get :autocomplete
    end

index.html.haml:

.container
  = form_tag presenters_path, method: :get do 
    - if params[:query].present?
      .btn-search.btn-clearsearch
        = link_to "clear", presenters_path
    - else
      .search
        Search
    = text_field_tag :query, params[:query],
                     id: "presenter_search",
                     autocomplete: "off"
    = submit_tag "go", class: "btn-search"

我正在使用 typeahead.js,所以它适用于:

application.html.haml:

= javascript_include_tag 'application'
= javascript_include_tag
  "//cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.9.3/typeahead.min.js"

presenter.js.coffee:

$ ->
    $('#presenter_search').typeahead
        name: "presenter"
        remote: "/presenters/autocomplete?query=%QUERY"

所以,再一次,我的问题是,如果我输入名字,所有匹配该名字的选项都会出现在下拉列表中(名字和姓氏),但只要我输入空格,整个建议列表消失。我无法搜索任何名字和姓氏“Jennifer H”。我可以猜测问题出在控制器/自动完成操作中的映射,但是输入:

.map(&:first_name, &:last_name)

.map(&:first_name, :last_name)

产生错误,并且

.map{ |presenter| presenter.slice(:first_name, :last_name) }

将下拉列表中的所有建议设为“未定义”。

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 您找到解决方案了吗?我现在正在寻找同样的问题:-/
  • 我不得不将我在 Elasticsearch 上的工作搁置一旁,只能暂时搜索一个属性。 :( 我将不得不回到它,希望在今年年底之前。当我找到解决方案时,我会告诉你。如果你找到一个并在此之前分享它,你将成为我的英雄。跨度>

标签: ruby-on-rails autocomplete elasticsearch searchkick


【解决方案1】:

希望这会有所帮助。记得用 rake searchkick 重新索引:reindex CLASS=Model_name

// in model

def full_name
  [first_name, last_name].join(' ') 
end

searchkick text_middle: ['full_name'], autocomplete: ['full_name']

def search_data
  {
    full_name: full_name
  }  
end

// in controller
users = User.search params[:query], fields: [{"full_name" => :text_middle}]

【讨论】:

  • 很好,回答阿努!谢谢!
  • @GLINDqvist:您是否按照这个建议进行操作?它对我没有用。您能否分享在您的代码中有效的代码 sn-p。
猜你喜欢
  • 2015-04-22
  • 2019-06-26
  • 2016-05-06
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多