3

映画モデルと、映画のジャンル ファセットを持つ検索ページがあります。検索ページのすべてのファセットの近くにあるチェックボックスを選択できます。チェックされたファセット用語のリストをコントローラーに渡し、映画コレクションをフィルター処理して、チェックボックスで選択されたジャンルの映画のみを含めたいと考えています。

インデックスと検索定義を使用した私のモデルは次のとおりです。

class Movie < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    indexes :id,           :index    => :not_analyzed
    indexes :title,        :analyzer => 'snowball', :boost => 100
    indexes :description,  :analyzer => 'snowball'
    indexes :genres do
      indexes :title, analyzer: 'keyword'
    end
  end

  def to_indexed_json
    to_json( include: { genres: { only: [:title, :id] } } )
  end

  def self.search(params={})
    tire.search(page: params[:page], per_page: 5, load: false) do
      query do
        all
        #boolean do
        #  must { string params[:query], :default_field => 'title' }
        #end
      end


      #filter 'genres.title', :values => params[:genres] if params[:genres].present?
      filter :terms, 'genres.title' => ['Genre 1', 'Genre 2', 'Genre 3']


      facet 'global-genres', global: true do
        terms 'genres.title', size: 15
      end
      facet 'scoped-genres' do
        terms 'genres.title', size: 15
      end
    end
  end

  attr_accessible :description, :title, :year, :genres

  has_and_belongs_to_many :genres, :uniq => true

end

この部分をどのように書き直すべきかわかりません:

#filter 'genres.title', :values => params[:genres] if params[:genres].present?
filter :terms, 'genres.title' => ['Genre 1', 'Genre 2', 'Genre 3']
#filter 'genres.id', :values => [1, 2, 3]

後で、ジャンルまたはジャンル ID のリストをパラメーターとして渡し、それらをフィルター処理する必要があります。

filter :terms, 'genres.title' => ['Genre 1', 'Genre 2', 'Genre 3']

「ジャンル 1」または「ジャンル 2」または「ジャンル 3」を持つ映画にフィルターをかけます。AND ロジックを持つには、これらのジャンルが必要です。

どうすればこれを適切に行うことができますか?

4

1 に答える 1

3

でフィルターを設定する必要がありますexecution: 'and'。これをタイヤ統合テスト スイートの例として追加しました。

s = Tire.search('articles-test') do
  query { all }
  filter :terms, :tags => ['ruby', 'python'], :execution => 'and'
end
于 2012-12-12T12:11:27.463 に答える