2013-04-26 2 views
2

У меня есть запрос, как показано ниже,фильтрации фасеты в elasticsearch

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"}}, 
     }} 

Но мои фасеты не отфильтрованы из-за моего IdS фильтра. Я получаю все грани, но я хочу, чтобы они были отфильтрованы моим фильтром идентификаторов выше. У вас есть идеи?

ответ

9

Хотя то, что вы делаете дела, уборщик решение будет иметь отфильтрованного запроса. 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.

+0

Это «обоснование» где-то в документах? Я не мог найти его, и это был ответ, который я искал. Хотел бы я проголосовать не один раз! –

+0

Да, конечно, это «где-то». Но я помню, что некоторое время назад это не было тривиально. Чтение всего руководства + api для чего-то, связанного с ES, никогда не будет ошибкой. –

1

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) 
     } 
     } 
    }, 
    } 
} 
Смежные вопросы