Фильтрация граней в asticsearch
У меня есть запрос, как показано ниже,
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"}},
}}
Но мои грани не фильтруются из-за моего фильтра идентификаторов. Я получил все грани, но я хочу, чтобы они были отфильтрованы моим фильтром идентификаторов выше. Есть ли у вас какие-либо идеи?
2 ответа
Решение
Хотя то, что вы делаете, работает, более чистым решением было бы иметь отфильтрованный запрос. http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/
Который учитывает ваш исходный запрос + некоторый произвольный фильтр (который, в свою очередь, может быть сложным логическим / вложенным фильтром и т. Д.)
{
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"}
}
}
}
Обоснование следующее:
- любой запрос применяется перед огранкой.
- любой фильтр применяется ПОСЛЕ огранки.
Поэтому, если вы хотите, чтобы ваши фасеты были отфильтрованы каким-либо фильтром, вы должны включить этот фильтр в QUERY.
facet_filter
исправил мою проблему,
как ниже,
{
"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)
}
}
},
}
}