elasticsearch facets

facetas de filtrado en elasticsearch



facets (2)

Tengo una consulta como a continuación,

query = { "query": {"query_string": {"query": "%s" % q}}, "filter":{"ids":{"values":list(ids)}}, "facets": {"destination": { "terms": {"field": "destination.en"}}, "hotel_class":{ "terms":{"field":"hotel_class"}}, "hotel_type":{ "terms":{"field": "hotel_type"}}, }}

Pero mis facetas no se filtran debido a mi filtro de ids. Obtengo todas las facetas, pero quiero que sean filtradas por mi filtro de ids arriba. Tienes alguna idea ?


Aunque lo que haces funciona, una solución más limpia sería tener una consulta filtrada. http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/

Que permite su consulta original + algún filtro arbitrario (que a su vez puede ser un filtro booleano / anidado complejo, etc.)

{ query: { "filtered" : { "query": {"query_string": {"query": "%s" % q}}, "filter":{"ids":{"values":list(ids)}}, } }, "facets": { "destination": { "terms": {"field": "destination.en"} }, "hotel_class": { "terms": {"field": "hotel_class"} }, "hotel_type": { "terms": {"field": "hotel_type"} } } }

La razón es la siguiente:

  • cualquier consulta se aplica ANTES de facetar.
  • cualquier filtro se aplica DESPUÉS de facetar.

Entonces, si quiere que sus facetas sean filtradas por algún filtro, debe incluir dicho filtro en la consulta.


facet_filter solucionó mi problema,

como abajo,

{ "query": { "query_string": { "query": "%s" %q } }, "filter": { "ids": { "values": list(ids) } }, "facets": { "destination": { "terms": { "field": "destination.en" }, "facet_filter": { "ids": { "values": list(ids) } } }, "hotel_class": { "terms": { "field": "hotel_class" }, "facet_filter": { "ids": { "values": list(ids) } } }, "hotel_type": { "terms": { "field": "hotel_type" }, "facet_filter": { "ids": { "values": list(ids) } } }, } }