[docker] 建立elasticSearch儲存資料與kibana呈現使用

本章介紹使用elasticSearch儲存資料與kibana呈現使用

本文內容:

  • 自行建立elasticSearch/kibana [docker]
  • 建立elasticSearch index與傳送資料
  • 使用kibana查詢資料

1.啟動docker-elasticSearch/kibana

  • 先備知識:docker & docker-compose
  • 先將網路上找到的docker-compose.yml內容編輯好,然後在一樣的目錄下開啟指令docker-compose up -d
1
2
3
4
$docker-compose up -d
WARNING: Some services (elasticsearch, kibana) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Starting elasticsearch-624 ... done
Starting kibana-624 ... done

需要一點時間,可以用Kitematic之類的工具查看有沒有成功

2.準備資料與index

  • 先設計資料內容,假設今天要收集一個使用者每天的運動紀錄
    這是一個有array的紀錄內容,內容可長可短。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    {
    "user": "user01",
    "timestamp": 1583734521000,
    "records": [
    {
    "record_name": "heart_rate",
    "data_number": 80,
    "data_txt": "avg"
    },
    {
    "record_name": "Calories",
    "data_number": 200
    },
    {
    "record_name": "time_duration",
    "data_number": 30,
    "record_unit": "min"
    }
    ]
    }

接著新增必須欄位的屬性index

  • user是一般text,timestamp是date
  • records先建立nested巢狀,在建立裡面的record_name等欄位。
  • 建立index: PUT localhost:9200/{index}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    PUT localhost:9200/event
    {
    "mappings": {
    "_doc": {
    "properties": {
    "user": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "id": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "timestamp": {
    "type": "date",
    "format": "epoch_millis"
    },
    "records": {
    "type": "nested",
    "properties": {
    "record_name": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "data_number": {
    "type": "long",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "data_txt": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "record_unit": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    }
    }
    }
    }
    }
    }
    }

送資料進去

kibana建立index

  • 建立index

    Management頁面->create index->填入event->選擇可以做時間分割的欄位名稱{上述是用timestamp}->按下create index pattern

  • Discover頁面搜尋資料

    再送一次資料,這次把 “timestamp”: {改成現在時間戳}->線上有很多工具可以做轉換
    回到Discover頁面,query最近15分鐘的資料->就可以看到時間軸了

  • Visualize 建立感興趣的圖表展示

    ex: table顯示/長條圖顯示等/或是特定filter資料。然後替圖表存檔。

  • Dashboard 頁面

    這邊把剛剛建立的圖表拉好顯示在這邊。

  • dev tools 頁面

    透過條件指令搜尋特定資料,如有程式需要可以用搜尋API試著找出自己想搜尋的內容

  • size/page/sort 分頁與排序依據

  • bool query 條件-filter時間/range/match/wildcard等搜尋

    • 所有 must 必须匹配,所有 must_not 都必须不匹配

    • minimum_should_match 參數控制需要匹配的 should 語句的數量

      範例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      GET /event/_search
      {
      "size": 1000,
      "query": {
      "bool": {
      "filter": {
      "range": {
      "timestamp": {
      "from": 159132465000,
      "include_lower": true,
      "include_upper": true,
      "to": 1591324650099
      }
      }
      },
      "must": [
      {
      "exists": {
      "field": "user"
      }
      },
      {
      "match": {
      "user": {
      "operator": "AND",
      "query": "user01"
      }
      }
      },
      {
      "nested": {
      "path": "records",
      "query": {
      "bool": {
      "must": [
      {
      "match": {
      "records.record_name": {
      "operator": "AND",
      "query": "heart_rate"
      }
      }
      },
      {
      "wildcard": {
      "records.data_txt": "*a*"
      }
      },
      {
      "range": {
      "records.data_number": {
      "from": 2,
      "include_lower": false,
      "include_upper": true,
      "to": null
      }
      }
      }
      ]
      }
      }
      }
      }
      ],
      "minimum_should_match": "1",
      "should": [
      {
      "match": {
      "user": {
      "operator": "AND",
      "query": "user01"
      }
      }
      },
      {
      "match": {
      "user": {
      "operator": "AND",
      "query": "user02"
      }
      }
      }
      ]
      }
      },
      "sort": [
      {
      "timestamp": {
      "order": "desc"
      }
      }
      ]
      }

網路參考文章

[docker] 建立elasticSearch儲存資料與kibana呈現使用

https://minilabmemo.github.io/2021/04/24/docker-elastic-kibana/

作者

Mini Lab Memo

發表於

2021-04-24

更新於

2023-07-09

許可協議

評論