如何在ElasticSearch中聚合过滤的嵌套文档?

Tid*_*ddo 10 elasticsearch

假设我有一个嵌套文档的索引,如下所示:

{
    "id" : 1234
    "cars" : [{
            "id" : 987
            "name" : "Volkswagen"
        }, {
            "id": 988
            "name" : "Tesla"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我现在想要获得符合特定标准的"汽车"文档的计数聚合,例如匹配搜索查询.我最初的尝试是以下查询:

{
  "query" : {
    "nested" : {
      "path" : "cars",
      "query" : {
        "query_string" : {
          "fields" : ["cars.name"],
          "query" : "Tes*"
        }
      }
    }
  },
  "aggregations" : {
    "cars" :{
      "nested" : {
        "path" : "cars"
      },
      "aggs" : {
        "cars" : {
          "terms" : {
            "field" : "cars.id"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望在这里得到一个聚合结果,只有名称以"Tes"开头的汽车的ID.但是,聚合反而使用顶级文档中的所有汽车,这些汽车也包含匹配的嵌套文档.也就是说,在上面的示例中,"Volkswagen"也会被计算在内,因为顶级文档还包含匹配的汽车.

如何只获得匹配的嵌套文档的聚合?

Tid*_*ddo 10

与此同时,我已经明白了:要实现这一目标,应在术语聚合周围添加过滤器聚合,如下所示:

  "aggregations" : {
    "cars" :{
      "nested" : {
        "path" : "cars"
      },
      "aggs" : {
        "cars-filter" : {
          "filter" : {
            "query" : {
              "query_string" : {
                "fields" : ["cars.name"],
                "query" : "Tes*"
              }
            }  
          },
          "aggs" : {
            "cars" : {
              "terms" : {
                "field" : "cars.id"
              }
            }
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)