在Elasticsearch中,如何使用过滤器执行嵌套和查询?

时间:2019-03-25 00:58:13

标签: elasticsearch

我创建了如下映射:

PUT cars
{  
   "mappings":{  
      "_doc":{  
         "properties":{  
            "metadata":{  
               "type":"nested"
            }
         }
      }
   }
}

然后我插入一个文档:

PUT /cars/_doc/1
{  
   "metadata":[  
      {  
         "key":"price",
         "value":20000
      },
      {  
         "key":"miles",
         "value":1000
      }
   ]
}

现在,我希望检索所有价格的总和(这里只有一个文档,但我仍然认为足以说明要点)。

我尝试过:

GET cars/_doc/_search

{
  "aggs": {
    "metadata": {
      "nested": {
        "path": "metadata"
      },
      "aggs": {
        "prices": {
          "sum": {
            "field": "metadata.value"
          }
        }
      }
    }
  }
}

但这将包括miles,我不想要。

如何添加过滤器,以便查询中仅包含price,即如何使查询返回20,000,而不是21,000?

1 个答案:

答案 0 :(得分:0)

由于您只想考虑价格,因此您所要做的就是过滤keyprice的嵌套文档。为此,您需要添加filter aggregation,如下所示:

{
  "aggs": {
    "metadata": {
      "nested": {
        "path": "metadata"
      },
      "aggs": {
        "price": {
          "filter": {
            "term": {
              "metadata.key": "price"
            }
          },
          "aggs": {
            "prices": {
              "sum": {
                "field": "metadata.value"
              }
            }
          }
        }
      }
    }
  }
}