Elasticsearch数组字段高频兴趣统计:聚合查询失效问题求助
统计Elasticsearch中人员最常见兴趣的解决方案
索引数据
{"index":{"_index":"companydatabase"}} {"FirstName":"ELVA","LastName":"RECHKEMMER","Designation":"CEO","Salary":"154000","DateOfJoining":"1993-01-11","Address":"8417 Blue Spring St. Port Orange, FL 32127","Gender":"Female","Age":62,"MaritalStatus":"Unmarried","Interests":["Body Building","Illusion","Protesting","Taxidermy","TV watching","Cartooning","Skateboarding"]} {"index":{"_index":"companydatabase"}} {"FirstName":"JENNEFER","LastName":"WENIG","Designation":"President","Salary":"110000","DateOfJoining":"2013-02-07","Address":"16 Manor Station Court Huntsville, AL 35803","Gender":"Female","Age":45,"MaritalStatus":"Unmarried","Interests":["String Figures","Working on cars","Button Collecting","Surf Fishing"]} {"index":{"_index":"companydatabase"}}
问题原因
你的聚合请求失效的核心问题是terms聚合的排序字段错误:Elasticsearch的terms聚合默认统计的计数字段是_count,而非你写的count,这会导致排序逻辑无法识别,进而无法正确返回兴趣的统计结果。
修正后的请求体与代码
修正后的请求体
request_body = { "size": 0, "aggs": { "interests": { "terms": { "field": "Interests.keyword", "size": 10, "order": { "_count": "desc" # 修正为正确的计数字段名 } } } } }
正确调用方式
无需额外包裹JSON(),直接调用es.search即可获取聚合结果:
response = es.search(index="companydatabase", body=request_body) # 打印聚合结果 print(response['aggregations']['interests']['buckets'])
结果说明
修正后,请求会返回按兴趣出现次数降序排列的桶(bucket),每个桶包含兴趣名称(key)和对应的出现次数(doc_count),你可以从中直接获取最常见的兴趣。
内容的提问来源于stack exchange,提问作者David Vazquez
相关产品推荐
相关产品推荐

