我正在使用elasticsearch_autocomplete gem 来实现自动完成功能。
我对特殊字符ñ
和重音有疑问áéíóú
。
模型:
class Car
ac_field :name, :description, :city, :skip_settings => true
def self.ac_search(params, options={})
tire.search load: true, page: params[:page], per_page: 9 do
query do
boolean do
must { string params[:query], default_operator: "AND" } if params[:query].present?
must { term :city, params[:city] } if params[:city].present?
end
end
filter :term, city: params[:city] if params[:city].present?
facet "city" do
terms :city
end
end
end
end
此版本适用于特殊字符。
例如:查询Martin
我得到所有结果Martín, martín, martin, Martin
使用这种方法,这就是问题所在:
现在结果是单个单词。例如,标记为 ["San Francisco", "Madrid"] 的城市最终将具有三个单独的标记。同样,如果我对“san francisco”进行查询(必须 { term 'city', params[:city] }),那将失败,而对“San”或“Francisco”的查询将成功。这里所需的行为是标签应该是原子的,因此只有“旧金山”(或“马德里”)标签搜索应该成功。
为了解决这个问题,我创建了我的自定义映射:
model = self
settings ElasticsearchAutocomplete::Analyzers::AC_BASE do
mapping _source: {enabled: true, includes: %w(name description city)} do
indexes :name, model.ac_index_config(:name)
indexes :description, model.ac_index_config(:description)
indexes :city, :type => 'string', :index => :not_analyzed
end
end
通过这种映射,多词的问题得到了解决,现在带有city
字段的方面可以正常工作:
而不是得到类型方面San
,Francisco
现在我得到了San Francisco
现在,问题是在模型内部使用此映射时,搜索不会找到带有特殊字符的结果
例如:查询Martin
我只得到结果Martin martin
我正在使用 mongoid 而不是活动记录。
我该如何解决这个问题?我认为问题在于asciifolding tokenfilter。