2012-05-03 55 views
5

我有幾個型號elasticsearch索引,其中一人有一個需要過濾的關聯,但如果我添加喜歡這個東西到search方法過濾器適用於與輪胎和ElasticSearch只有一種模式在Rails的

search.filter :range, 'sessions.starts_on' => {:gte => start_date, 
               :lte => ends_on} 

然後所有的模型都被過濾掉,因爲它們沒有這樣的關聯sessions

那麼有沒有辦法將過濾器應用到只有一個模型?

任何想法是非常感謝!

+0

你使用的是AciveRecord嗎?你有沒有考慮自定義to_json索引方法呢? – abhas

+0

是的ActiveRecord。並定製索引 - 具體如何?有這些'sessions.starts_on'返回什麼? – alony

回答

1

創建一個與該模型特別相關的輪胎索引模塊,並將其包含在模型中。由於會話只與該模型相關聯,因此它將在彈性搜索的文檔中引用它。你必須在會議文件這樣你的模型文件合併爲我們通過文檔的JSON輪胎指數模塊elasticsearch

def to_model_json 
    self.document.merge({"sessions" => sessions.as_json}).to_json 
end 

這種方法是通過在JSON文件通過將在其輪胎elasticsearch其會話合併在文檔中。

輪胎指數模塊給它,你可以在輪胎搜索對象傳遞給運行過濾器指數名稱查詢

現在創建一個輪胎搜索對象

search_object = Tire::Search::Search::new(Model.index_name, other attributes) 

,您可以檢查其他屬性您可以從https://github.com/karmi/tire

通過,則像這樣運行你的搜尋方法會得到期望的結果

search_object.filter :range, 'sessions.starts_on' => {:gte => start_date, 
                :lte => ends_on}