第16編elasticsearch集約データ分析に深く入り込む


1.bucketとmetricの2つのコア概念
単語の意味は理解できます:bucket:バケツは私たちのデータをグループ化します;sqlではgroup by user_に相当するid
metric:メトリック基準は、1つのデータパケットに対して実行される何らかの集約分析の操作であり、例えば平均値を求め、最大値を求め、最小値を求める.
2、家電量販店のケース背景
一つの家電量販店におけるテレビの販売データを背景に、さまざまなブランド、さまざまな色のテレビの販売量と売上高について、さまざまな角度から分析しています.
//データのセットを追加する:
PUT /tvs
{
    "mappings": {
        "sales": {
            "properties": {
                "price": {
                    "type": "long"
                },
                "color": {
                    "type": "keyword"
                },
                "brand": {
                    "type": "keyword"
                },
                "sold_date": {
                    "type": "date"
                }
            }
        }
    }
}

POST /tvs/sales/_bulk
{ "index": {}}
{ "price" : 1000, "color" : "  ", "brand" : "  ", "sold_date" : "2016-10-28" }
{ "index": {}}
{ "price" : 2000, "color" : "  ", "brand" : "  ", "sold_date" : "2016-11-05" }
{ "index": {}}
{ "price" : 3000, "color" : "  ", "brand" : "  ", "sold_date" : "2016-05-18" }
{ "index": {}}
{ "price" : 1500, "color" : "  ", "brand" : "TCL", "sold_date" : "2016-07-02" }
{ "index": {}}
{ "price" : 1200, "color" : "  ", "brand" : "TCL", "sold_date" : "2016-08-19" }
{ "index": {}}
{ "price" : 2000, "color" : "  ", "brand" : "  ", "sold_date" : "2016-11-05" }
{ "index": {}}
{ "price" : 8000, "color" : "  ", "brand" : "  ", "sold_date" : "2017-01-01" }
{ "index": {}}
{ "price" : 2500, "color" : "  ", "brand" : "  ", "sold_date" : "2017-02-12" }

3、どの色のポイントが一番売れているかを集計する
GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : { 
        "popular_colors" : { 
            "terms" : { 
              "field" : "color"
            }
        }
    }
}

size:       ,            
aggs:    ,              
popular_colorsaggs,       ,        ,       ok
termsfield

検索結果:
{
  "took": 61,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "popular_color": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "  ",
          "doc_count": 4
        },
        {
          "key": "  ",
          "doc_count": 2
        },
        {
          "key": "  ",
          "doc_count": 2
        }
      ]
    }
  }
}
hits.hits:     size 0,  hits.hits    ,                     
aggregations:    
popular_color:            
buckets:       field    buckets
key:  bucket      
doc_count:  bucket   ,      
  ,           

       bucket     
       :  doc_count    

4、実戦bucket+metric:各色テレビの平均価格を統計する
GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

   aggs   bucket  (terms),   json   ,    aggs,     aggs  ,      ,    metric  ,avg,      bucket        field:price field,      

    metric,       bucket      ,   bucket       metric

5、bucketネストによる色+ブランドの多層ドリルダウン分析
色からブランドまでドリルダウン分析を行い、各色の平均価格、および各色の各ブランドの平均価格(グループ化の場合、グループ化)を見つけます.
GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "color_avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "group_by_brank":{
          "terms": {
            "field": "brand"
          },
          "aggs": {
            "brand_avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

6、より多くのmetricsを掌握する:各色テレビの最大最小平均総価格を統計する
count:bucket,terms,自動的にdoc_がありますcount,相当于count avg:avg aggs,求平均値max:求一个bucket内,指定field値最大的那データmin:求一个bucket内,指定field値最小的那データsum:求一个bucket内,指定field値の総和
GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" } },
            "min_price" : { "min": { "field": "price"} }, 
            "max_price" : { "max": { "field": "price"} },
            "sum_price" : { "sum": { "field": "price" } } 
         }
      }
   }
}

7、実戦histogramは価格区間によってテレビの販売量と売上高を統計する
histogram:termsと同様にbucketパケット操作を行う.違いは、fieldを受信し、このfieldの値の各範囲区間に従ってbucketパケット操作bucket分割を行う方法、termsは、fieldの値が同じデータを1つのbucketに分割することである.
GET /tvs/sales/_search
{
   "size" : 0,
   "aggs":{
      "price":{
         "histogram":{ 
            "field": "price",
            "interval": 2000
         },
         "aggs":{
            "revenue": {
               "sum": { 
                 "field" : "price"
               }
             }
         }
      }
   }
}

interval:2000,    :0~20002000~40004000~60006000~80008000~10000,buckets

8、実戦データhitogramの統計毎月のテレビ販売量
date histogram:私たちが指定したdateタイプの日付fieldと日付intervalに従って、一定の日付間隔でbucket min_を区分します.doc_count:ある日付intervalでも、2017-01-01~2017-01-31でデータが1つもない場合、この区間は返されます.そうしないと、デフォルトではこの区間のextended_がフィルタされます.bounds,min,max:bucketを区切るときは、この開始日と締め切り日に限定されます
GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold_date",
            "interval": "month", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2016-01-01",
                "max" : "2017-12-31"
            }
         }
      }
   }
}

9、ドリルダウン分析の統計四半期ごとのブランドごとの売上高
GET /tvs/sales/_search 
{
  "size": 0,
  "aggs": {
    "group_by_sold_date": {
      "date_histogram": {
        "field": "sold_date",
        "interval": "quarter",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2016-01-01",
          "max": "2017-12-31"
        }
      },
      "aggs": {
        "group_by_brand": {
          "terms": {
            "field": "brand"
          },
          "aggs": {
            "sum_price": {
              "sum": {
                "field": "price"
              }
            }
          }
        },
        "total_sum_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

10、検索+集約:指定ブランドの下で各色の販売量を統計する
GET /tvs/sales/_search 
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "  "
      }
    }
  },
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

11、global bucket:単一ブランドとすべてのブランドの販売量の対比
Aggregation、scopeの集約操作は、queryの検索結果の範囲内で実行する必要があります.すべてのデータを集約する必要がある場合があります.global:global bucketです.これまでのqueryにかかわらず、すべてのデータを集約scopeに組み込むことです.
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"
          }
        }
      }
    }
  }
}

12、フィルタ+集約:統計価格が1200より大きいテレビの平均価格
GET /tvs/sales/_search 
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "price": {
            "gte": 1200
          }
        }
      }
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

13、bucket filter:ブランドの最近一ヶ月の平均価格を統計する
GET /tvs/sales/_search 
{
  "size": 0,
  "query": {
    "term": {
      "brand": {
        "value": "  "
      }
    }
  },
  "aggs": {
    "recent_30d": {
      "filter": {
        "range": {
          "sold_date": {
            "gte": "now-30d"
          }
        }
      },
      "aggs": {
        "recent_150d_avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

14、並べ替え:各色の平均売上高の昇順で並べ替える
GET /tvs/sales/_search 
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "avg_price": "asc"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

15、色+ブランドのドリルダウン分析時に最深層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"
              }
            }
          }
        }
      }
    }
  }
}

16、易並列重合アルゴリズム、近似重合アルゴリズム、三角選択原則
パラレル集約アルゴリズム:maxなどの集約アルゴリズムは簡単に並列できます.shardごとに1万件のデータがある可能性があります.その後、この1万件のデータからmax値を抽出し、これらのshardから取り出した値をcoordinate nodeに置いて最大のmax値をフィルタします.近似集約アルゴリズム:count(distinc)の重量除去数などのアルゴリズムがあり、データが多くなります.この場合esは近似集約の方法を採用します.nodeごとに近似推定を行う方法で最終的な結論を得ます.性能は向上しますが、5%程度の誤差があります.三角選択の原則:正確+リアルタイム+ビッグデータ->2つを選択します.
(1)精確+リアルタイム:ビッグデータがなくて、データ量がとても小さくて、それでは普通は単機で走って、勝手にあなたがどのように遊ぶことができます(2)精確+ビッグデータ:hadoop、バッチ処理、非リアルタイム、大量のデータを処理することができて、精確を保証して、数時間(3)ビッグデータ+リアルタイム:esを走ることができて、精確ではありませんて、近似して推定して、何パーセントの誤り率があるかもしれません
17、cardinalityのデリバリーアルゴリズム及び毎月の販売ブランド数量統計
Esデマルチプレクシング:cardinality metricは、各bucketの指定されたfieldをデマルチプレクシングし、count(distinct)と同様にデマルチプレクシングします.
GET /tvs/sales/_search
{
  "size" : 0,
  "aggs" : {
      "months" : {
        "date_histogram": {
          "field": "sold_date",
          "interval": "month"
        },
        "aggs": {
          "distinct_colors" : {
              "cardinality" : {
                "field" : "brand"
              }
          }
        }
      }
  }
}

18.cardinalityアルゴリズムの最適化メモリオーバーヘッド及びHLLアルゴリズム
上記cardinalityはcount(distinct)に相当し、5%のエラー率があり、性能は100 ms程度precision_threshold最適化精度とメモリオーバーヘッド
GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand",
              "precision_threshold" : 100 
            }
        }
    }
}
brand  ,  brand unique value100   ,cardinality,    100%  
cardinality  ,   precision_threshold * 8 byte100 * 8 = 800   

19、percentilesパーセンテージアルゴリズムおよびWebサイトアクセス遅延統計
需要:たとえば、要求されるたびにアクセスする時間を記録するサイトがあり、tp 50、tp 90、tp 99を統計する必要があります.
tp 50:50%のリクエストの消費時間が最長でどれくらいの時間tp 90:90%のリクエストの消費時間が最長でどれくらいの時間tp 99:99%のリクエストの消費時間が最長でどれくらいの時間
PUT /website
{
    "mappings": {
        "logs": {
            "properties": {
                "latency": {
                    "type": "long"
                },
                "province": {
                    "type": "keyword"
                },
                "timestamp": {
                    "type": "date"
                }
            }
        }
    }
}

POST /website/logs/_bulk
{ "index": {}}
{ "latency" : 105, "province" : "  ", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 83, "province" : "  ", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 92, "province" : "  ", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 112, "province" : "  ", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 68, "province" : "  ", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 76, "province" : "  ", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 101, "province" : "  ", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 275, "province" : "  ", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 166, "province" : "  ", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 654, "province" : "  ", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 389, "province" : "  ", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 302, "province" : "  ", "timestamp" : "2016-10-29" }

次にクエリを行います.
GET /website/logs/_search 
{
  "size": 0,
  "aggs": {
    "latency_percentiles": {
      "percentiles": {
        "field": "latency",
        "percents": [
          50,
          95,
          99
        ]
      }
    },
    "latency_avg": {
      "avg": {
        "field": "latency"
      }
    }
  }
}