[英]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.