0

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

这是查询

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

此行删除所有执行者和用户,因为他们没有 :approved 字段。

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

这条线显然删除了所有不好的非场地。

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

除了向所有用户和执行者添加一个已批准的:真实字段之外,还有什么想法吗?我认为这样的东西是我在概念上想要的:

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

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

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

1 回答 1

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/

于 2013-08-17T18:18:57.063 回答