2013-02-01 43 views
0

我一直在試圖弄清楚如何使用Tire使用嵌套對象進行混合布爾搜索。我發現的所有簡單示例都不包含更復雜的查詢(在其他屬性上搜索時)。使用Tire(和ElasticSearch)混合複雜布爾值時遇到問題

我的搜索涉及到找到需要特定類型人員的團隊。當試圖建立一個足球隊時,球隊需要填補某些類型的特定體重隊員的球員名單,可以選擇排除一個任期或另一個任期。

其他參數(如「地區」或「種類」)與團隊的參與地點以及團隊的類型(休閒,競爭等)有關。

我的當前設置:

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

都不是真正能夠給我充分的結果。

回答

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 

下面是輪胎的integration tests一些例子。

希望這會有所幫助:)

相關問題