0

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

完全な結果を得ることができる人は誰もいません。

4

1 に答える 1

1

マッピングでネストされたタイプが欠落しているようです:

mapping do
  indexes :region, index: :not_analyzed
  indexes :kind,   index: :not_analyzed

  indexes :role_requirements, type: 'nested' do
    indexes :need,            type: 'boolean'
    indexes :weight_class_id, type: 'integer'
    indexes :role_id,         type: 'integer'
  end

  # ..more mappings..

end

次に、次のようにクエリを作成できます。

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?

      must do
        nested path: 'role_requirements' do
          query do
            boolean do
              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
    end
  end
end

ここに、Tire の統合テストの例をいくつか示します。

お役に立てれば :)

于 2013-07-31T12:17:08.570 に答える