searchkick/asticsearch настроить автозаполнение с несколькими атрибутами

Я настроил свое приложение с помощью гема searchkick и работаю над функцией автозаполнения для моего индекса Presenters. Моя проблема в том, что я ищу по нескольким полям (first_name и last_name), и хотя я могу искать докладчика по обоим полям - например, если у меня есть Presenter 'Jennifer Hall', я могу напечатать 'Jennifer' или 'Hall "и имя" Дженнифер Холл "появится в раскрывающемся списке автозаполнения, но если я введу" Дженнифер "(после добавления пробела), имя исчезнет, ​​и предложений больше не будет. Мой вопрос, как я могу это исправить?

Мой код

Я следовал этому руководству: добавление поиска и автозаполнения в приложение Rails с 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| и т.д. } идея отсюда:

Как я могу сопоставить несколько атрибутов в рельсах с Gem Searchkick

Однако, когда я в точности следовал решению, я получил только "неопределенное" в раскрывающемся списке предлагаемых имён. Изменив его на 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"

Итак, еще раз, моя проблема заключается в том, что если я введу имя, все параметры, соответствующие этому имени, появятся в раскрывающемся списке (как имя, так и фамилия), но как только я введу пробел, полный список предложений уходит. У меня нет возможности искать, скажем, любое имя и фамилию "Дженнифер Х". Я могу догадаться, что проблема заключается в отображении в действии контроллер / автозаполнение, но набрав:

.map(&:first_name, &:last_name)

или же

.map(&:first_name, :last_name)

генерировать ошибки и

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

делает все предложения в раскрывающемся списке "неопределенными".

Любые предложения о том, как решить эту проблему?

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}]
Другие вопросы по тегам