【问题标题】:Elasticsearch term AND range filter using tire使用轮胎的 Elasticsearch 术语和范围过滤器
【发布时间】:2013-08-17 11:45:33
【问题描述】:

我正在尝试在基于 elasticsearch+tire 的 Rails 中构建搜索功能,从而可以搜索具有关联对象及其值的过滤的人员。一个人有_many 个对象,一个对象有_many 个值。

我已经设法使对象名称 (params[:object]) 上的过滤起作用,但不适用于对象+值。我应该如何为值和映射构造范围过滤器,以便值依赖于对象?

人员控制器

mapping do
  indexes :objects do
    indexes :_id   
    indexes :object_values do
      indexes :value
    end
  end     
  indexes :name, type: 'string', analyzer: 'snowball'  
end

def self.search(params)
  tire.search do
    query do
      boolean do
        must { string params[:query]} if params[:query].present?    
      end
    end
    filter :term, {"objects._id" => params[:object]} if params[:object].present?
    filter :range, “objects.object_values.value”  => {from: params[:value] } if   params[:value].present?
  end
end


def to_indexed_json
{      
  :name       => name,
  :objects => objects.map { |o| { 
    :_type => 'object',
    :_id   => o.id,
    :object_values => o.object_values.map {|ov| {
      :_type => 'object_value',
      :_id => ov.id,
      :value => ov.value } },
    } }
}.to_json
end

【问题讨论】:

    标签: ruby-on-rails elasticsearch tire


    【解决方案1】:

    使用gtgte 而不是from 来指定范围的下限

    filter :range, “objects.object_values.value”  => {from: params[:value] }
    

    【讨论】:

    • 谢谢,gte/gt 效果很好。术语过滤器嵌套的情况如何?如果我想用 value + id 找到 object_values: filter :term, {"objects.object_values._id" => params[:object]} if params[:object].present?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多