实现思路
- 数据筛选:利用ElasticSearch的过滤条件筛选出满足销量排名前10%、价格区间在100 - 500以及产地为中国广东的商品。
- 聚合统计:对筛选后的商品按照品牌进行聚合统计。
- 性能优化:从索引设计、查询参数等方面降低集群压力。
DSL语句
{
"query": {
"bool": {
"filter": [
{
"range": {
"price": {
"gte": 100,
"lte": 500
}
}
},
{
"term": {
"origin.keyword": "中国广东"
}
}
]
}
},
"aggs": {
"top_selling_brands": {
"filter": {
"rank_feature": {
"field": "sales",
"top": 0.1
}
},
"aggs": {
"by_brand": {
"terms": {
"field": "brand.keyword",
"size": 100
}
}
}
}
}
}
性能优化策略
- 索引设计优化:
- 字段类型:确保字段类型定义准确,例如对于固定值的产地、品牌等字段使用keyword类型,避免text类型带来的分词开销。
- 索引分片:合理分配索引分片数量,根据数据量和集群规模进行调整,避免分片过多或过少导致的性能问题。
- 副本数量:根据集群的可用性和性能需求,适当调整副本数量,减少不必要的副本以降低写操作压力。
- 查询参数调整:
- size参数:在聚合时,合理设置
terms
聚合的size
参数,避免返回过多数据。如示例中设置为100,仅返回前100个品牌的聚合结果。
- 缓存:利用ElasticSearch的缓存机制,如请求缓存,对频繁查询的结果进行缓存,减少重复计算。
- 批量操作:如果可能,将多个相关查询合并为一个批量查询,减少网络开销。