ElasticSearch轮胎两个场条件滤波器

时间:2013-08-17 18:05:05

标签: ruby-on-rails-3 filter elasticsearch tire

我正在使用Tire和rails 3进行多指标查询,我想过滤掉已批准=>的场地是的,所以我需要某种组合过滤器。

这是查询

query = params[:q]
from = params.delete(:from)
size = params[:size] || 25
Tire.search(
  [Venue.index_name, 
   Performer.index_name, User.index_name], load: true) do |s|
    s.query do
      string(query, fields: [:_all, :name, :title], use_dis_max: true)
    end
    s.from from if from
    s.size size if size
  end.results.to_a

此行会删除所有表演者和用户,因为他们没有:已批准的字段。

s.filter(:term, :approved => true )

这条线明显地消除了所有不合适的非场地。

s.filter(:term, { :approved => true, :index_name => 'venues'} )

除了向所有用户和表演者添加已批准的:true字段之外的任何想法?我认为这是我想要的概念:

s.filter(:term, :approved => true, :if => {:index_name => 'venues'} )

编辑感谢Mallox,我能够找到应该构建但我还在努力实现它的轮胎。看起来下面的代码应该可以工作,但它不会返回任何查询结果。我也删除了" {:terms => {:index_name => ["表演者","用户"]}},"为了确保我没有使用索引名称或多行查询,这是问题,但仍然没有运气。任何人都可以了解如何在提尔这样做吗?

      s.filter(:bool, :should => [ 
        {:terms => { :index_name => ["performers", "users"]}},
        {:term => { :approved => true}},
      ] )

1 个答案:

答案 0 :(得分:3)

所以我对Ruby和Tire知之甚少,但是你要构建的ElasticSearch查询将基于bool过滤器,它包含一些“应该”条目(这将转化为包含OR)。

所以在你的情况下,有些东西:

"filter" : {
    "bool" : {
        "should" : [
            {
                "terms" : { "_type" : ["Performers","Users"] }
            },
            {
                "term" : { "approved" : true }
            }
        ]
    }
}

看看这里的文档,也许这会有所帮助: :http://www.elasticsearch.org/guide/reference/query-dsl/bool-filter/