一尘不染

在Elasticsearch中过滤方面

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

但是由于我的ID过滤器,我的构面未过滤。我得到了所有方面,但我希望通过上面的ID过滤器对其进行过滤。你有什么想法 ?


阅读 218

收藏
2020-06-22

共1个答案

一尘不染

尽管您的工作可行,但更干净的解决方案是使用过滤查询。
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中包括该过滤器。

2020-06-22