2012-08-23 15 views
11

Quiero filtrar el booleano privado de mi clase, por lo que solo muestra los recursos que no son privados, pero no funciona para mí. (Humillando el código tremendamente)Elastic Search/Tire: ¿Cómo se filtra un atributo booleano?

mapping do 
    indexes :private, type: "boolean" 
    indexes :name, type: "string" 
end 
end 

def self.search(params) 
    tire.search(load: true, page: params[:page], per_page: 20) do 
     query { string params[:query] } if params[:query].present? 
     # So far I've tried... 
     # filter :bool, :private => ["false"] 
     # filter :bool, private: false 
    end 
end 

¿Cómo hago esto correctamente?

Respuesta

16
filter :term, :private => false 

debe hacer el truco. Dependiendo de si usted quiere hacer cosas con las facetas que puede ser más eficiente para hacer su filtrar una consulta filtrada en lugar de en el nivel superior, es decir

tire.search(...) do 
    query do 
    filtered do 
     query { string, params[:query] } 
     filter :term, :private => false 
    end 
    end 
end 

no debería cambiar los resultados sin embargo.

También puede hacer esto con un filtro bool, pero no es la forma en que ha intentado - dentro de un filtro bool que necesita para construir una structure que dice lo que es opcional y lo que no

es Por ejemplo

tire.search(load: true, page: params[:page], per_page: 20) do 
    query { string params[:query] } if params[:query].present 
    filter :bool, :must => {:term => {:private => true}} 
end 

Un filtro bool es más lento que el uso de un filtro and (que es lo que hace el neumático entre bastidores si especifica varios filtros), pero obviamente le da más flexibilidad.

3

Según la elasticsearch - guide, booleanos se almacenan como T o F, por lo que me gustaría probar el filtrado por T o F.

Por ejemplo

filter :terms, :private => ['T'] 

neumáticos no he utilizan realmente, esto es solo basado en alguna investigación sobre la guía y en el examples.

4

Usted puede tratar de:

tire.search(load: true, page: params[:page], per_page: 20) do 
    query do 
     boolean do 
      must { string params[:query] } if params[:query].present? 
      must { term :private, true } 
     end 
    end 
end 
Cuestiones relacionadas