1. 程式人生 > >Elasticsearch學習之深入聚合分析三---案例實戰

Elasticsearch學習之深入聚合分析三---案例實戰

引用 實戰 avg buck oba core 電視 針對 過濾

1. 統計指定品牌下每個顏色的銷量

任何的聚合,都必須在搜索出來的結果數據中進行,搜索結果,就是聚合分析操作的scope

GET /tvs/sales/_search 
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "小米"
      }
    }
  },
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

2. 單個品牌與所有品牌銷量對比

一個聚合操作,必須在query的搜索結果範圍內執行出來兩個結果,一個結果,是基於query搜索結果來聚合的; 一個結果,是對所有數據執行聚合的

GET /tvs/sales/_search 
{
  "size": 0, 
  "query": {
    "term": {
      "brand": {
        "value": "長虹"
      }
    }
  },
  "aggs": {
    "single_brand_avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "all": {
      "global": {},
      "aggs": {
        "all_brand_avg_price"
: { "avg": { "field": "price" } } } } } }

global:就是global bucket,就是將所有數據納入聚合的scope,而不管之前的query

3. 統計價格大於1200的電視平均價格

搜索+聚合,過濾+聚合

GET /tvs/sales/_search 
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "
price": { "gte": 1200 } } } } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } }

4. 統計電視品牌最近一個月的銷量

GET /tvs/sales/_search 
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "長虹"
      }
    }
  },
  "aggs": {
    "recent_150d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-150d"
          }
        }
      },
      "aggs": {
        "recent_150d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "recent_140d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-140d"
          }
        }
      },
      "aggs": {
        "recent_140d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "recent_130d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-130d"
          }
        }
      },
      "aggs": {
        "recent_130d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

aggs.filter,針對的是聚合去做的,如果放query裏面的filter,是全局的,會對所有的數據都有影響

但是,如果,比如說你要統計長虹電視最近1個月的平均值; 最近3個月的平均值; 最近6個月的平均值

bucket filter:就是對不同的bucket下的aggs,進行filter

5. 統計每個顏色的電視的銷售額,按照銷售額降序排序

GET /tvs/sales/_search 
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "avg_price": "asc"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

類似引用其他變量,本例中就是引用aggs中統計的每個顏色電視的平均價格

6. 顏色+品牌下鉆分析時按最深層metric進行排序

GET /tvs/sales/_search 
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "group_by_brand": {
          "terms": {
            "field": "brand",
            "order": {
              "avg_price": "desc"
            }
          },
          "aggs": {
            "avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

按照每種顏色下的每種品牌的平均價格進行降序排列

Elasticsearch學習之深入聚合分析三---案例實戰