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}]