1. 程式人生 > >kibana對Elasticsearch做增刪改查操作,以及一些聚合查詢

kibana對Elasticsearch做增刪改查操作,以及一些聚合查詢

kibana是一個視覺化平臺,設計出來用於和Elasticsearch一起使用的。你可以用kibana搜尋、檢視、互動存放在Elasticsearch索引裡的資料。

準備工作:Elasticsearch啟動完畢,elasticsearch-head啟動完畢 kibana 啟動完畢

然後訪問http://localhost:5601,點選Dev Tools,就是以下圖片的介面.

 然後我們就可以對Elasticsearch做增刪改查資料的操作了

1.先新增索引也就是資料庫的庫名

PUT test_data
{
  "settings": {
    "index":{
        "number_of_shards":5,
        "number_of_replicas":1
    }
  }
}

新增成功,會在Elasticsearch-head 中檢視是否多出來一個索引

 2.繼續新增型別和資料

#test_data索引名稱,相當於資料庫名稱 
#product 型別,相當於資料庫的表名
#1就是要儲存資料的id,不寫的話預設給一個長字串
PUT test_data/product/1
{
  "name":"華為電腦",
  "address":"深圳",
  "price":9600,
  "creat_time":"2019-01-02"
}

Elasticsearch-head就有資料了

 3.修改某個欄位的資料


#修改
POST test_data/product/3/_update
{
  "doc":{
    "price":5835
  }
}

4.刪除一條記錄

#刪除
DELETE test_data/product/3

5.刪除index,刪除整個庫

#刪除索引
DELETE test_data

6. 獲取設定資訊

GET test_data/_settings

7.獲取所有的設定

GET _all/_settings

這樣一個簡單的增刪改查就弄好了

接下來用新增好的資料做一些簡單的聚合分析,一些統計,求最大數,最小數,平均值等等

1.根據商品名稱計算每個商品數量

#計算每種電腦有多少數量
GET test_data/product/_search
{
  "size": 0,
  "aggs": {
    "group_by_name": {
      "terms": {
        "field": "name.keyword"
      }
    }
  }
}
#size:只獲取聚合結果,而不執行聚合原始資料
#aggs:固定語法,要對一份資料執行分組聚合操作
#group_by_name:就是對每個aggs,都要起一個名字,這個名字是隨機的,你隨便取什麼都ok
#terms:根據欄位的值進行分組
#field:根據指定的欄位的值進行分組

 對返回的資料分析

hits.hits:指定了size是0,所以hits.hits為空,否則會把執行聚合的那些原始資料給你返回回來

aggregations:聚合結果                         group_by_name:我們指定的某個聚合的名稱

buckets:根據我們指定的field劃分出的buckets           key:每個bucket對應的那個值

doc_count:這個bucket分組內,有多少個數據           預設的排序規則:按照doc_count降序排序

2.計算北京地區,統計地址的數量

#計算北京地區,統計地址的數量
GET test_data/product/_search
{
  "size": 0,
  "query": {
    "match": {
        "address": "深圳"
    }
  },
  "aggs": {
    "all_names": {
      "terms": {
        "field": "address.keyword"
      }
    }
  }
}

返回的資料

 3.計算每個商品下的平均價格/最小价格/最大價格/總價

#計算北京地區,統計地址的數量
GET test_data/product/_search
{
  "size": 0,
  "aggs": {
    "group_by_names":{
      "terms": {"field": "name.keyword"},
      "aggs": {
        "avg_price":{"avg": {"field": "price"}},
        "min_price":{"min": {"field": "price"}},
        "max_price":{"max": {"field": "price"}},
        "sum_price":{"sum": {"field": "price"}}
      }
    }
  }
}
#count:buckets,terms,自動就會有一個doc_count,就相當於是count
#avg:avg aggs 求平均值
#max:求一個bucket內,指定field值最大的那個資料
#min:求一個bucket內,指定field值最小的那個資料
#sum:求一個bucket內,指定field值的總和先分組,再算每組的平均值

 返回結果

avg_price:我們自己取的metric aggs的名字
value:我們的metric計算的結果,每個bucket中的資料的price欄位求平均值後的結果

4.計算商品下的平均價格,並且按照平均價格降序排列

collect_mode

對於子聚合的計算,有兩種方式:

  • depth_first 直接進行子聚合的計算
  • breadth_first 先計算出當前聚合的結果,針對這個結果在對子聚合進行計算。

"order": { "avg_price": "desc" }

#計算商品下的平均價格,並且按照平均價格降序排列
GET test_data/product/_search
{
  "size": 0,
  "aggs": {
   "all_names":{
     "terms": { "field": "name.keyword","collect_mode": "breadth_first","order": {
       "avg_price": "desc"}},
       "aggs": {
         "avg_price": {
           "avg": {"field": "price"}
         }
       }
     }
  }
}

返回結果

 5.按照指定的價格範圍區間進行分組,然後在每組內再按照name進行分組,最後再計算每組的平均價格 

"ranges": [{},{}]

#按照指定的價格範圍區間進行分組,然後在每組內再按照name進行分組,最後再計算每組的平均價格  ranges:[{}]
GET test_data/product/_search
{
  "size": 0,
  "aggs": {
   "group_by_price":{
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 50,
            "to": 4000
          }
        ]
      },
      "aggs": {
        "group_by_names": {
          "terms": {
            "field": "name.keyword"
          },
          "aggs": {
            "avg_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
     }
  }
}

返回結果

6.histogram

類似於terms,也是進行bucket分組操作,接收一個field,按照這個field的值的各個範圍區間,進行bucket分組操作

interval:10,劃分範圍,0~10,10~20,20~30

#histogram
GET test_data/product/_search
{
  "size": 0,
  "aggs": {
   "price":
   {
     "histogram": {
       "field": "price",
       "interval": 6000
     },
     "aggs": {
       "revenue": {
         "sum": {
           "field": "price"
         }
       }
     }
   }
  }
}

返回結果

7.date histogram

按照我們指定的某個date型別的日期field,以及日期interval,按照一定的日期間隔,去劃分bucket

date interval = 1m,  2017-01-01~2017-01-31,就是一個bucket        2017-02-01~2017-02-28,就是一個bucket

然後會去掃描每個資料的date field,判斷date落在哪個bucket中,就將其放入那個bucket

min_doc_count:即使某個日期interval,2017-01-01~2017-01-31中,一條資料都沒有,那麼這個區間也是要返回的,不然預設是會過濾掉這個區間的

min_doc_count:即使某個日期interval,2017-01-01~2017-01-31中,一條資料都沒有,那麼這個區間也是要返回的,不然預設是會過濾掉這個區間的

GET test_data/product/_search
{
  "size": 0,
  "aggs": {
    "time":{
      "date_histogram": {
        "field": "creat_time",
        "interval": "month",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds":{
          "min":"2019-01-01",
          "max":"2019-01-02"
        }
      }
    }
  }
}

返回資料

8.global

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


GET test_data/product/_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"
          }
        }
      }
    }
  }
}
#single_brand_avg_price:就是針對query搜尋結果,執行的,拿到的,就是華為電腦的平均價格
#all.all_brand_avg_price:拿到所有品牌的平均價格

返回結果