Elasticsearch 过滤嵌套对象

Cpt*_*nch 5 json elasticsearch

我有一个简化的对象,看起来像这样:

"name" : "Partner Name",
"features" : [ 
    {
        "val" : "Family",
        "key" : "Type"
    },
    {
        "val" : "Paris",
        "key" : "City"
    }
],
"variants" : [ 
    {
        "name" : "Activity 1 Name",
        "description" : "Quick description",
        "price" : 20
    }
]
Run Code Online (Sandbox Code Playgroud)

我想按“城市”和“类型”键进行过滤。我当前的查询按价格过滤,但无法使其适用于城市或类型。向过滤器数组添加更多项并没有达到目的。

'query':{
    'filtered':{
        'query':{
            'query_string':{
                'query':query
            }
        },
    'filter': {
        'bool':{
            'filter': [{ 
                    'range': {
                        'variants.price': {
                            'gte': 0
                        }
                    }
                },
                { 
                    'range': {
                        'variants.price': {
                            'lte': 50
                        }
                    }
                },
                {
                    'term': {
                        'active': true
                    }
                }
            ]
        }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。谢谢!

And*_*fan 6

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "filter": [
            {
              "range": {
                "variants.price": {
                  "gte": 0
                }
              }
            },
            {
              "range": {
                "variants.price": {
                  "lte": 50
                }
              }
            },
            {
              "nested": {
                "path": "features",
                "query": {
                  "bool": {
                    "should": [
                      {"term":{"features.key":"type"}},
                      {"term":{"features.key":"city"}}
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)