2013-08-17 47 views
0

我正在做轮胎索引查询使用轮胎和轨道3,我想过滤出已批准=> false的场所,所以我需要某种组合过滤器。ElasticSearch轮胎两个领域的条件过滤器

下面是该查询

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 => [”performers“,”users“]}}”,以确保它不是我使用的索引名称或多行查询问题,仍然没有运气。任何人都可以通过Tire了解如何做到这一点?

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

回答

3

所以我对Ruby和轮胎的小知识,而是要建立ElasticSearch查询将基于一个布尔值过滤,包含一些“应当”条目(这将转化为包容性的OR)。

所以你的情况的东西沿着线:

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

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

+0

谢谢您的回答。我会加快它的速度,因为它指向我应该构建这绝对是我需要的。然而,它似乎(我希望我错了),轮胎有多个嵌套应布尔子句的狡猾的支持。希望有人能帮助我与Tire合作。 – LennonR