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

10

假设我有一个包含嵌套文档的索引,看起来像这样:

{
    "id" : 1234
    "cars" : [{
            "id" : 987
            "name" : "Volkswagen"
        }, {
            "id": 988
            "name" : "Tesla"
        }
    ]
}

我现在希望获得一个“car”文档的计数聚合,这些文档符合特定的条件,例如符合搜索查询。我的初始尝试是以下查询:

{
  "query" : {
    "nested" : {
      "path" : "cars",
      "query" : {
        "query_string" : {
          "fields" : ["cars.name"],
          "query" : "Tes*"
        }
      }
    }
  },
  "aggregations" : {
    "cars" :{
      "nested" : {
        "path" : "cars"
      },
      "aggs" : {
        "cars" : {
          "terms" : {
            "field" : "cars.id"
          }
        }
      }
    }
  }
}

我本来希望得到一个聚合结果,只包含以“Tes”开头的汽车的ID。然而,聚合操作实际上使用了所有包含匹配嵌套文档的顶级文档中的汽车。也就是说,在上面的例子中,“大众”也会被计算在内,因为顶级文档还包含一辆匹配的汽车。

我该如何只获取匹配嵌套文档的聚合结果呢?

1个回答

10

与此同时,我已经想出来了:要实现这个目标,应该在词项聚合周围添加一个过滤器聚合,就像这样:

  "aggregations" : {
    "cars" :{
      "nested" : {
        "path" : "cars"
      },
      "aggs" : {
        "cars-filter" : {
          "filter" : {
            "query" : {
              "query_string" : {
                "fields" : ["cars.name"],
                "query" : "Tes*"
              }
            }  
          },
          "aggs" : {
            "cars" : {
              "terms" : {
                "field" : "cars.id"
              }
            }
          }
        }
      }
    }
  }

1
你确定这段代码能正常工作吗?我遇到了同样的问题,但是当我尝试你的代码时,我得到了一个“parsing_exception”错误:“没有为[query]注册的[query]”。 - Valentin Waeselynck
当我创建这个查询时,它确实有效,但是ES的查询格式并不总是向后兼容的。如果我没记错,我是为ES1.x编写了这个查询,更新的版本可能不会接受它。 - Tiddo
是的,@Tiddo - 我和你得到了相同的回应。我也看不出如何在当前版本中实现这一点。如果你有任何进展,请告诉我。 - danieljames
现在没有“filter”查询了。您需要使用带有过滤子句的bool查询。 - hackel
@Tiddo,你能提供5.6.7 ES格式的上述查询吗? - Vinit89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接