2

我有一个如下查询,

    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 过滤器,我的方面没有被过滤。我得到了所有方面,但我希望它们被我上面的 ids 过滤器过滤。你有什么想法 ?

4

2 回答 2

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 中包含所述过滤器。

于 2013-04-26T13:23:37.317 回答
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)
        }
      }
    },
  }
}
于 2013-04-26T08:23:38.510 回答