1

関連するオブジェクトとその値をフィルタリングして人物を検索できるようにするelasticsearch+tireに基づいて、レールで検索機能を構築しようとしています。Person has_many Objects と Object has_many Values です。

オブジェクト名 (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
4

1 に答える 1

1

gtorを使用して、範囲の下限を指定しgteますfrom

filter :range, “objects.object_values.value”  => {from: params[:value] }
于 2013-08-17T03:45:33.233 に答える