【问题标题】:ElasticSearch Tire two field conditional filterElasticSearch Tire 两字段条件过滤器
【发布时间】:2013-08-17 18:05:05
【问题描述】:

我正在使用 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}},
      ] )

【问题讨论】:

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


    【解决方案1】:

    所以我对 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/

    【讨论】:

    • 感谢您的回答。我要赞成它,因为它指出我应该构造这绝对是我需要的。然而,看起来(我希望我错了)Tire 对多个嵌套的应该布尔子句有一些狡猾的支持。希望有人可以帮助我使用轮胎。
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多