2012-05-03 11 views
5

ho diversi modelli indicizzati con elasticsearch e uno di loro ha un'associazione che deve essere filtrato, ma se aggiungo qualcosa di simile nella search metodoFiltro applica ad un solo modello con Tiro e elasticsearch in Rails

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

quindi tutti i modelli sono filtrati perché non hanno una tale associazione sessions.

Quindi esiste un modo per applicare il filtro a un solo modello?

Ogni pensiero è molto apprezzato!

+0

stai usando AciveRecord? e hai pensato di personalizzare il metodo dell'indice to_json per questo? – abhas

+0

sì per ActiveRecord. E indice di personalizzazione - come esattamente? avere queste 'sessions.starts_on' restituire cosa? – alony

risposta

1

Creare un modulo per indice pneumatici specificamente correlato a quel modello e includerlo nel modello. Poiché le sessioni sono solo associazioni con il modello, il suo riferimento sarà lì nel documento che sta per elasticsearch. Bisogna unire il documento sessioni nel documento modello come questo, come abbiamo superato la JSON di documento da elasticsearch nel modulo indice pneumatici

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

questo metodo sta passando un documento in JSON per elasticsearch attraverso il pneumatico che sarà avere la loro sessioni unite nel documento.

nel modulo indice pneumatici dare un nome indice che è possibile passare l'oggetto di ricerca del pneumatico per eseguire il filtro interroga

Ora creare un oggetto di ricerca del pneumatico

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

è possibile controllare altri attributi che si può passare da https://github.com/karmi/tire

quindi eseguire il metodo di ricerca come questo che darà il risultato desiderato

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