0

我一直在试图弄清楚如何使用轮胎进行使用嵌套对象的混合布尔搜索。我发现的所有简单示例都不包含更复杂的查询(在搜索其他属性时)。

我的搜索涉及找到一个“需要”特定类型人员的团队。当试图建立一支足球队时,球队需要在名单上填充特定体重级别的某些类型的球员,可以选择排除一个或另一个。

其他参数,例如“地区”或“种类”,与球队的比赛地点以及球队的类型(休闲、竞技等)有关。

我目前的设置:

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 无法解析事物,要么是轮胎没有该范围内的方法:

通过这个实现,这里是生成的 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 回答