2012-05-03 14 views
5

tengo varios modelos indexados con elasticsearch y uno de ellos tiene una asociación que debe ser filtrada, pero si añado algo como esto en el search métodofiltro se aplica a un solo modelo con Tiro y Elasticsearch en Rails

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

luego todos los modelos se filtran porque no tienen dicha asociación sessions.

¿Hay alguna manera de aplicar filtro a un solo modelo?

¡Cualquier idea es muy apreciada!

+0

¿está usando AciveRecord? y ¿ha considerado personalizar el método de índice to_json para esto? – abhas

+0

sí para ActiveRecord. Y personalizando el índice, ¿cómo exactamente? tener estas 'sessions.starts_on' return what? – alony

Respuesta

1

Cree un módulo para el índice de neumáticos específicamente relacionado con ese modelo e inclúyalo en el modelo. Como las sesiones son solo una asociación con el modelo, su referencia estará allí en el documento que va a elasticsearch. Usted tiene que combinar el documento sesiones en el documento de modelo como éste, ya que pasamos el JSON del documento a Elasticsearch en el módulo índice de neumáticos

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

este método está pasando un documento en JSON para Elasticsearch través de neumático que va a tener su sesiones fusionadas en el documento.

en el módulo índice de neumáticos dar un nombre de índice que puede pasar en el objeto de la búsqueda de neumáticos para ejecutar el filtro de consultas

A continuación, cree un objeto de búsqueda de neumáticos

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

puede comprobar otros atributos que se puede pasar de https://github.com/karmi/tire

a continuación, ejecutar su método de búsqueda como esto le dará el resultado deseado

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