💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 分析 最后,我们还有一个需求需要完成:允许管理者在职员目录中进行一些分析。 Elasticsearch有一个功能叫做**聚合(aggregations)**,它允许你在数据上生成复杂的分析统计。它很像SQL中的`GROUP BY`但是功能更强大。 举个例子,让我们找到所有职员中最大的共同点(兴趣爱好)是什么: ```Javascript GET /megacorp/employee/_search { "aggs": { "all_interests": { "terms": { "field": "interests" } } } } ``` 暂时先忽略语法只看查询结果: ```Javascript { ... "hits": { ... }, "aggregations": { "all_interests": { "buckets": [ { "key": "music", "doc_count": 2 }, { "key": "forestry", "doc_count": 1 }, { "key": "sports", "doc_count": 1 } ] } } } ``` 我们可以看到两个职员对音乐有兴趣,一个喜欢林学,一个喜欢运动。这些数据并没有被预先计算好,它们是实时的从匹配查询语句的文档中动态计算生成的。如果我们想知道所有姓"Smith"的人最大的共同点(兴趣爱好),我们只需要增加合适的语句既可: ```Javascript GET /megacorp/employee/_search { "query": { "match": { "last_name": "smith" } }, "aggs": { "all_interests": { "terms": { "field": "interests" } } } } ``` `all_interests`聚合已经变成只包含和查询语句相匹配的文档了: ```Javascript ... "all_interests": { "buckets": [ { "key": "music", "doc_count": 2 }, { "key": "sports", "doc_count": 1 } ] } ``` 聚合也允许分级汇总。例如,让我们统计每种兴趣下职员的平均年龄: ```Javascript GET /megacorp/employee/_search { "aggs" : { "all_interests" : { "terms" : { "field" : "interests" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } } } ``` 虽然这次返回的聚合结果有些复杂,但任然很容易理解: ```Javascript ... "all_interests": { "buckets": [ { "key": "music", "doc_count": 2, "avg_age": { "value": 28.5 } }, { "key": "forestry", "doc_count": 1, "avg_age": { "value": 35 } }, { "key": "sports", "doc_count": 1, "avg_age": { "value": 25 } } ] } ``` 该聚合结果比之前的聚合结果要更加丰富。我们依然得到了兴趣以及数量(指具有该兴趣的员工人数)的列表,但是现在每个兴趣额外拥有`avg_age`字段来显示具有该兴趣员工的平均年龄。 即使你还不理解语法,但你也可以大概感觉到通过这个特性可以完成相当复杂的**聚合**工作,你可以处理任何类型的数据。