如何在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
相关产品推荐
相关产品推荐

