Tireを使用して、ネストされたオブジェクトを使用する混合ブール検索を行う方法を見つけようとしています。私が見つけたすべての単純な例には、より複雑なクエリは含まれていません (他の属性を検索する場合)。
私の検索には、特定のタイプの人を「必要とする」チームを見つけることが含まれます。サッカー チームを編成しようとする場合、チームは、特定の体重クラスの特定のタイプの選手で名簿を埋める必要があります。いずれかのタームを除外するオプションがあります。
「地域」や「種類」などの他のパラメーターは、チームがプレーする場所と、チームの種類 (カジュアル、競争力など) に関係しています。
私の現在の設定:
mapping do
indexes :region, index: :not_analyzed
indexes :kind, index: :not_analyzed
indexes :role_requirements do
indexes :need, type: 'boolean'
indexes :weight_class_id, type: 'integer'
indexes :role_id, type: 'integer'
end
.
.
.
end
def self.search(params)
team_params = params[:team_search]
tire.search(page: params[:page], per_page: 10) do
query do
boolean do
must { string team_params[:query], default_operator: "AND" } if team_params[:query].present?
must { term :kind, team_params[:kind] } if team_params[:kind].present?
must { term :region, team_params[:region] } if team_params[:region].present?
if team_params[:weight_class_id].present? || team_params[:role_id].present?
must { term 'role_requirements.need', true }
end
must { term 'role_requirements.weight_class_id', team_params[:job_id].to_i } if team_params[:weight_class_id].present?
must { term 'role_requirements.role_id', team_params[:role_id].to_i } if team_params[:role_id].present?
.
.
.
end
end
end
end
私はいくつかの方法を試しましたが、通常、ElasticSearch が物事を解析できないか、Tire がスコープ内にメソッドを持っていないことに問題があるようです:
この実装で生成される to_json は次のとおりです: https://gist.github.com/8a615e701eb31ff2e250
現在、結果が得られていません。
私が試したさまざまな方法: https://gist.github.com/907c9571caa0e87bad27
完全な結果を得ることができる人は誰もいません。