オートコンプリート機能に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"] というタグが付けられた都市は、最終的に 3 つの個別のタグを持つことになります。同様に、"san francisco" (must { 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
アクティブレコードの代わりにモンゴイドを使用しています。
この問題を解決するにはどうすればよいですか? 問題はasciifolding tokenfilterにあると思います。