ruby-on-rails - Rails ElasticSearch Tire - 同时过滤多个参数的嵌套字段

标签 ruby-on-rails elasticsearch tire

我有一个电影模型和一个包含电影流派分面的搜索页面。 可以选择搜索页面上每个方面附近的复选框。 我将选中的方面术语列表传递给 Controller ​​,我想过滤电影集合以仅包含那些使用复选框选择了流派的电影。

我的带有索引和搜索定义的模型是:

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 逻辑。

我怎样才能正确地做到这一点?

最佳答案

您需要使用 execution: 'and' 设置过滤器。我有 added这是 Tire 集成测试套件的示例:

s = Tire.search('articles-test') do
  query { all }
  filter :terms, :tags => ['ruby', 'python'], :execution => 'and'
end

关于ruby-on-rails - Rails ElasticSearch Tire - 同时过滤多个参数的嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13358125/

相关文章:

ruby-on-rails-3 - 轮胎和 Elasticsearch -对象关联

javascript - 添加 ajax 来删除对象 - Rails

ruby-on-rails - 如何使用 RSpec 在 RESTful API 中使用 token 身份验证测试 Rails 设计登录?

ruby-on-rails - 如何测试轮胎indexed_json结果?

ruby-on-rails - 使用 Tire 和 ElasticSearch 搜索多个模型

java - 从在 docker 容器中运行的 elasticsearch 客户端连接 elasticsearch 集群(即非 dockerized)

ruby-on-rails - 在 Rails 应用程序中实现 Web 服务客户端的最佳实践

ruby-on-rails - 祖先 - 如何获得所有没有 child 的 parent ?

elasticsearch - Spring Data Elasticsearch 字段映射

elasticsearch - 如何在 spring boot 应用程序中显示 elasticsearch 查询