You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中计算指定作者关联类别的图书平均售价

问题原因

你之前的查询之所以只返回指定作者文档的价格,是因为整个聚合链路都限定在包含该作者的文档范围内,反向嵌套后依然无法突破这个上下文,所以拿不到其他作者同类别图书的数据。


解决方案(分两步实现,不使用terms聚合)

第一步:获取指定作者关联的所有类别ID(去重)

用scripted_metric聚合收集并去重类别ID,替代terms聚合:

GET books/_search
{
  "size": 0,
  "query": {
    "nested": {
      "path": "author",
      "query": {
        "term": {
          "author.id": 1  // 替换为目标作者的ID
        }
      }
    }
  },
  "aggs": {
    "target_genres": {
      "scripted_metric": {
        "init_script": "state.genre_ids = new HashSet()",
        "map_script": """
          for (genre_id in doc['genre.id']) {
            state.genre_ids.add(genre_id.value)
          }
        """,
        "combine_script": "return state.genre_ids",
        "reduce_script": """
          def all_genres = new HashSet();
          for (bucket in states) {
            all_genres.addAll(bucket);
          }
          return all_genres;
        """
      }
    }
  }
}

执行后会得到类似{"target_genres": {"value": [23, 34]}}的结果,这就是目标作者涉及的所有唯一类别ID。

第二步:计算这些类别下全量图书的平均售价

用第一步得到的类别ID过滤所有文档,计算均价:

GET books/_search
{
  "size": 0,
  "query": {
    "nested": {
      "path": "genre",
      "query": {
        "terms": {
          "genre.id": [23, 34]  // 填入第一步获取的类别ID集合
        }
      }
    }
  },
  "aggs": {
    "average_book_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

这个查询会返回所有属于目标类别(无论作者是谁)的图书平均售价,完全满足需求。


内容的提问来源于stack exchange,提问作者Joe Riess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:44:55