弹性搜索中的过滤方面

时间:2013-04-26 08:16:19

标签: elasticsearch facets

我有如下查询,

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

但由于我的ID过滤器,我的方面未被过滤。 我得到了所有方面,但我希望它们通过上面的id过滤器进行过滤。 你有什么想法吗?

2 个答案:

答案 0 :(得分: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中包含所述过滤器。

答案 1 :(得分: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)
        }
      }
    },
  }
}