1

オートコンプリート機能に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フィールドを含むファセットが正常に機能するようになりました。

タイプファセットを取得する代わりにSanFrancisco今私は取得しますSan Francisco

さて、問題は、モデル内のこのマッピングでは、検索で特殊文字を含む結果が見つからないことです

例: でクエリを実行するMartinと、次の結果のみが得られますMartin martin

アクティブレコードの代わりにモンゴイドを使用しています。

この問題を解決するにはどうすればよいですか? 問題はasciifolding tokenfilterにあると思います。

4

1 に答える 1

1

私は問題を修正しました:

 class User
   include Mongoid::Document
   field :city, :type => String
   has_one: car
 end

 class Car
  ac_field :name, :description, :user_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 { term :user_city, params[:user_city] } if params[:user_city].present?
        end
      end
      facet "cities" do
        terms :user_city
      end
     end
   end

   model = self
    settings ElasticsearchAutocomplete::Analyzers::AC_BASE do
     mapping _source: {enabled: true, includes: %w(car_city name description)} do
     indexes :car_city, :type => 'string', :index => :not_analyzed 
    end
   end

   def to_indexed_json
     to_json(methods: [:user_city])
   end
   def user_city
    user.city
   end
 end
于 2013-10-07T13:21:36.363 に答える