Фильтрация граней в 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)
        }
      }
    },
  }
}
Другие вопросы по тегам