2

私はかなり長い間、単純なクエリであるべきものに対して頭を悩ませてきました。すべてのドキュメントと例、およびTireStackOverflow に関するほとんどの質問を調べましたが、成功しませんでした。

基本的に、関連するモデルの ID に基づいて検索結果をフィルタリングしようとしています。

モデルは次のとおりです (現時点ではまだ動的マッピングを使用していることに注意してください)。

class Location < ActiveRecord::Base
  belongs_to :city
  has_and_belongs_to_many :tags

  # also has a string attribute named 'kind'
end

私がやろうとしているのは、検索クエリを 、 、および でフィルタリングするcity_idことtag_idですkind

クエリを作成しようとしましたが、正しく作成できないように見えるため、エラーしか発生しません。これが私がこれまでに持っているものです(機能していません):

Location.search do
  query { string params[:query] } if params[:query].present?
  filter :term, { city_id: params[:city_id] } if params[:city_id].present? # I'd like to use the ids filter, but have no idea of the syntax I'm supposed to use
  filter :ids, { 'tag.id', values: [params[:tag_id]] } if params[:tag_id].present? # does not compile
  filter :match, { kind: params[:kind] } if params[:kind].present? # does not compile either
end
4

1 に答える 1

3

動的マッピングは、この種のシナリオには適していないことがわかりました。また、データのインデックス方法も定義する必要がありました。

これが私のマッピングです:

mapping do
  indexes :id, index: :not_analyzed
  indexes :kind, index: :not_analyzed
  indexes :city_id, index: :not_analyzed
  indexes :tags do
    indexes :id, index: :not_analyzed
  end
end

と私のカスタムto_indexed_json:

def to_indexed_json
  {
    kind: kind,
    city_id: city_id,
    tags: tags.map do |t|
      {
        id: t.id
      }
    end
  }.to_json
end

最後に、次のようにフィルタリングできます。

  Location.search do
    query { string params[:query] } if params[:query].present?
    filter :term, { city_id: params[:city_id] } if params[:city_id].present?
    filter :term, { "tags.id" => params[:tag_id] } if params[:tag_id].present?
    filter :term, { kind: params[:kind] } if params[:kind].present?
  end

"tags.id"重要な部分は、フィルターで使用できるようにするタグのインデックス作成です。

于 2012-10-17T16:23:09.853 に答える