[英]Partial Search with Mongodb in Rails application with Elasticsearch
[英]Partial matching elasticsearch rails
我目前正在使用elasticsearch按名稱查找客戶端,如果您輸入全名,則可以使用。 但是,即使客戶僅輸入名稱的前兩個字母,我也需要能夠進行搜索。 盡管出現此錯誤,但我嘗試使用部分匹配。
AdGroup.__elasticsearch__.create_index! force:true
[!!!] Index does not exist (Elasticsearch::Transport::Transport::Errors::NotFound)
Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"analyzer on field
[client_name] must be set when search_analyzer is
set"}],"type":"mapper_parsing_exception","reason":"Failed to parse
mapping [ad_group]: analyzer on field [client_name] must be set when
search_analyzer is set","caused_by":{"type":"mapper_parsing_exception","reason":"analyzer on field [client_name] must be set when search_analyzer is set"}},"status":400}
我的模型/ad-group.rb
class AdGroup < ActiveRecord::Base
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
settings analysis: {
filter: {
ngram_filter: { type: "nGram", min_gram: 2, max_gram: 12 }
},
analyzer: {
index_ngram_analyzer: {
type: 'custom',
tokenizer: 'standard',
filter: ['lowercase', 'ngram_filter']
},
search_ngram_analyzer: {
type: 'custom',
tokenizer: 'standard',
filter: ['lowercase']
}
}
} do
mapping do
indexes :published
indexes :client_name,:type => "string", index_analyzer: "index_ngram_analyzer", search_analyzer: "search_ngram_analyzer"
indexes :created_at
indexes :updated_at
indexes :preview_updated_at
end
end
控制器/廣告組
class AdGroupsController < ApplicationController
def index
if params[:client_name]
@ad_groups = AdGroup.search(params[:client_name]).page(params[:page]).results
else
@ad_groups = AdGroup.includes(:client).where(is_template: false).paginate(:page => params[:page]).order('id DESC')
end
end
end
知道為什么嗎?
問題是您要定義search_analyzer
和index_analyzer
,而不是默認analyzer
。 看一下文檔 。
如果您修改將client_name
的分析器設置為的代碼行,它將起作用:
indexes :client_name,:type => "string", analyzer: "index_ngram_analyzer", search_analyzer: "search_ngram_analyzer"
這樣,它將在索引時間使用默認analyzer
,而在查詢時間將使用search_analyzer
。
我不確定這對您有多大幫助,但是我不得不為想要搜索業務的客戶處理這個問題。 當然,這是一年多以前的事情了,所以我不記得詳細信息了,但是我必須在business_profiles_controller.rb
進行此更改。
def index
if params[:query].present?
@business_profiles = BusinessProfile.search(params[:query], fields: [{ name: :word_middle }])
else
@business_profiles = BusinessProfile.all
end
end
標志:word_middle
允許我們在:name
字段中搜索每個業務資料。
我希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.