如何通过Azure认知搜索/语义搜索查询返回字段平均值
Azure Search 实现AVG类聚合的正确方案
前置配置校验(请求失败90%是这几个配置没对)
- 索引字段属性检查:存储年龄的
age字段必须设置为可筛选(filterable: true),数值类型要设为Edm.Int32或者Edm.Double,如果建索引时把age设成了字符串类型、或者没开filterable,所有聚合请求都不会返回正确结果。 - 索引器解析模式检查:从DataLake Blob同步CSV数据时,索引器的
parsingMode必须配置为delimitedText,如果用默认的default模式,CSV文件会被识别为单个长文本块,不会拆成独立的age、department等结构化字段,根本没法做数值计算。 - 列映射检查:跑个不带聚合的全量查询
search=*&$select=age&top=5,确认返回结果里age字段有正常的数值,不是null或者乱码,如果值不对就去调整索引器的fieldMappings,把CSV里的年龄列和索引的age字段做正确映射。
正确的API请求参数写法
聚合是Azure Search的基础查询能力,和你用simple查询还是semantic语义查询没有冲突,不需要为了算聚合强行开语义配置。要实现SELECT AVG(age) FROM EMPLOYEES的效果,直接调用索引的docs查询接口,传如下JSON请求体即可,注意API版本要选2021-04-30之后的正式版本,过老的版本不支持聚合参数:
{ "search": "*", "queryType": "simple", "select": "", "count": true, "top": 0, "aggregations": [ { "field": "age", "type": "average", "name": "avg_employee_age" } ] }
参数说明:
search: "*"匹配索引里的所有员工记录,不需要传关键词top: 0表示不返回具体的单条员工文档,只返回聚合结果,能大幅减小响应体积aggregations数组里可以同时加多个统计规则,比如要同时算平均年龄、最大年龄、员工总数,就追加对应配置:
"aggregations": [ {"field": "age", "type": "average", "name": "avg_employee_age"}, {"field": "age", "type": "maximum", "name": "max_employee_age"}, {"field": "id", "type": "count", "name": "total_employee_count"} ]
如果要做带条件的聚合,比如只算某部门的平均年龄,加filter参数即可,和SQL的WHERE逻辑一致:
{ "search": "*", "queryType": "simple", "filter": "department eq '研发中心'", "top": 0, "aggregations": [ {"field": "age", "type": "average", "name": "avg_rd_age"} ] }
常见失败原因排查
- 只配置了语义查询参数没加aggregations:语义搜索的
semanticConfiguration、queryType: "semantic"这类配置只负责结果的语义排序、摘要提取,本身不具备数值统计能力,不管用哪种查询类型,要拿统计结果必须显式传aggregations参数。 - 聚合结果返回0或者null:先检查age字段的类型是不是数值型,再检查索引里的文档是不是都同步了age字段的值,字符串类型的字段不支持average、sum这类数值聚合。
- 报400参数错误:检查API版本是不是太低,或者aggregations里引用的字段名是不是和索引schema里的字段名完全一致,字段名大小写敏感。
内容的提问来源于stack exchange,提问作者roney
相关产品推荐
相关产品推荐

