【问题标题】:How can I aggregate filtered nested documents in ElasticSearch?如何在 ElasticSearch 中聚合过滤的嵌套文档?
【发布时间】:2015-05-06 16:14:21
【问题描述】:

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

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

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

{
  "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。但是,聚合改为使用顶级文档中的所有汽车,该文档还包含匹配的嵌套文档。也就是说,在上面的示例中,“Volkswagen”也将被计算在内,因为顶级文档还包含匹配的汽车。

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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    与此同时,我已经想通了:为了实现这一点,应该在术语聚合周围添加过滤聚合,如下所示:

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

    【讨论】:

    • 您确定此代码有效吗?我面临同样的问题,但是当我尝试您的代码时,我得到了一个 parsing_exception"no [query] registered for [query]"
    • 当我创建这个查询时它确实有效,但是 ES 的查询格式并不总是保持向后兼容。 IIRC 我为 ES1.x 编写了这个查询,较新的版本可能不接受它。
    • 是的,@Tiddo - 我得到了和你一样的回应。看不到如何为当前版本执行此操作。让我知道你是否有任何用处。
    • 不再有“过滤器”查询。您需要使用带有过滤子句的 bool 查询。
    • @Tiddo 你能提供5.6.7 ES格式的上述查询吗?
    猜你喜欢
    • 2015-11-14
    • 2018-01-30
    • 2014-12-31
    • 2017-04-15
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多