繁体   English   中英

searchkick / elasticsearch设置具有多个属性的自动完成功能

[英]searchkick/elasticsearch set up autocomplete with multiple attributes

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

我的守则

我已经学习了本教程: 使用Elasticsearch将搜索和自动完成添加到Rails应用程序

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 {|演示者| 来自这里的想法:

如何使用searchkick gem在rails中映射多个属性

但是,当我完全遵循解决方案时,我在建议名称的下拉列表中只有“未定义”。 将其更改为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) }

使下拉列表中的所有建议都显示为“未定义”。

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

希望这可以帮助。 请记住使用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}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM