面试题答案
一键面试- 使用
geo_distance
聚合来筛选距离指定中心点100公里内的店铺:- 在Elasticsearch查询中,使用
aggs
(聚合)部分来定义地理距离聚合。假设索引名为shops_index
,文档类型为shop
,指定中心点的经纬度为lon
和lat
。
{ "aggs": { "shops_within_100km": { "geo_distance": { "field": "地理位置", "origin": { "lat": lat, "lon": lon }, "distance": "100km" }, "aggs": { "by_category": { "terms": { "field": "类别" }, "aggs": { "avg_revenue": { "avg": { "field": "营业额" } } } } } } } }
- 在Elasticsearch查询中,使用
- 考虑不同地区店铺分布密度不同导致的偏差:
- 使用采样:可以在查询中添加
size
参数来限制返回的文档数量,进行采样。例如设置size: 1000
,这样可以避免因数据量过大导致计算资源耗尽,同时也能在一定程度上代表整体数据。
{ "size": 1000, "aggs": { "shops_within_100km": { "geo_distance": { "field": "地理位置", "origin": { "lat": lat, "lon": lon }, "distance": "100km" }, "aggs": { "by_category": { "terms": { "field": "类别" }, "aggs": { "avg_revenue": { "avg": { "field": "营业额" } } } } } } } }
- 加权平均:如果有关于店铺分布密度的额外信息,比如某个区域的权重,可以在计算平均营业额时使用加权平均。可以在文档中新增一个表示权重的字段
weight
,然后使用weighted_avg
聚合。
{ "aggs": { "shops_within_100km": { "geo_distance": { "field": "地理位置", "origin": { "lat": lat, "lon": lon }, "distance": "100km" }, "aggs": { "by_category": { "terms": { "field": "类别" }, "aggs": { "weighted_avg_revenue": { "weighted_avg": { "value": { "field": "营业额" }, "weight": { "field": "weight" } } } } } } } } }
- 使用采样:可以在查询中添加