ElasticSearch與Kibana簡介及使用入門


Elasticsearch一款基於Apache Lucene™開源搜索引擎,其核心是迄今為止最先進、性能最好的、功能最全的搜索引擎庫Lucene。Elasticsearch使用簡單,具有非常強大的全文搜索功能:

  • 分布式的實時文件存儲,每個字段都被索引並可被搜索
  • 分布式的實時分析搜索引擎
  • 可以擴展到上百台服務器,處理PB級結構化或非結構化數據

ElasticSearch中使用到的概念

准實時

Elasticsearch是一個准實時系統:一個文檔從存儲到它能夠被檢索只有一個很短的延遲(通常情況下為一秒)。

集群(Cluster)

為所有數據提供存儲和檢索等服務的結點(服務器)集合。默認的名字為“elasticsearch”,結點(服務器)也依據名字被指定要加入哪個集群。

結點(Node)

作為集群的一部分,為數據提供存儲和檢索服務的一台服務器。

索引(Index)

索引的概念類似於關系數據庫中的數據庫,是相關文檔存儲的地方。相應的,“索引一個文檔”表示把一個文檔存儲在某個索引中。

類型(Type)

索引中文檔的邏輯分類,類似於關系數據庫中的表。

Elasticsearch 6.0.0.已經不支持在一個索引中建立多個類型,在以后版本中會移除類型這一個概念。

文檔(Document)

一條完整的記錄,類似於關系數據庫中的元組。

域(Fields)

類似於關系數據庫中的屬性。

倒排索引

Elasticsearch會為文檔中的每個字段都建立倒排索引,這是它實現高效搜索的基礎之一。

ElasticSearch類比傳統數據庫

Relational DB Elasticsearch
Databases Indices
Tables Types
Rows Documents
Columns Fields

安裝

Elasticsearch 需要 Java8 或更新的 Java 環境。Java 下載

下載 Elasticsearch 6.0.1 壓縮包並解壓

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz $ tar -xvf elasticsearch-6.0.1.tar.gz 
  • 1
  • 2

啟動

$ cd elasticsearch-6.0.1/bin $ ./elasticsearch 
  • 1
  • 2

如果你不想使用默認的集群名和結點名,可以在啟動時指定相應的參數:

$ ./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name 
  • 1

交互

Elasticsearch啟動后是一個 http 服務,默認在本地的 9200 端口。可以通過 curl 或者 Kibana 控制台進行操作。使用 curl 的命令格式如下:

$ curl -X<VERB> '<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>' 
  • 1
  • VERB:HTTP 方法,如 GET、POST、PUT、HEAD、DELETE
  • PROTOCOL:http 或者 https 協議
  • HOST: Elasticsearch集群中的任何一個節點的主機名,如果是在本地的節點,那么就叫localhost
  • PORT: Elasticsearch HTTP服務所在的端口,默認為 9200
  • PATH: API路徑
  • QUERY_STRING: 一些可選的查詢請求參數,例如?pretty參數將使請求返回更加美觀易讀的JSON數據
  • BODY: 一個JSON格式的請求主體(如果請求需要的話)

例. 查詢集群中結點的健康狀況

$ curl -X GET "localhost:9200/_cat/health?v" 
  • 1
  • 綠色:一切安好
  • 黃色:所有結點均可用,某些結點沒有備份
  • 紅色:某些結點不可用

添加一個名為“customer”的索引

$ curl -X PUT "localhost:9200/customer?pretty" 
  • 1

查看現有的所有索引

$ curl -X GET "localhost:9200/_cat/indices?v" 
  • 1

在索引“customer”中添加一個 ID 為 1 顧客的信息,即一個文檔(文檔類型為 doc)

$ curl -X PUT "localhost:9200/customer/doc/1?pretty" -H 'Content-Type: application/json' -d' { "name": "John Doe" } ' 
  • 1
  • 2
  • 3
  • 4
  • 5

查看顧客1的信息

$ curl -X GET "localhost:9200/customer/doc/1?pretty" 
  • 1

將顧客1的姓名改為 “Jane Doe”

$ curl -X PUT "localhost:9200/customer/doc/1?pretty" -H 'Content-Type: application/json' -d' { "name": "Jane Doe" } ' 
  • 1
  • 2
  • 3
  • 4
  • 5

查看顧客1的信息

$ curl -X GET "localhost:9200/customer/doc/1?pretty" 
  • 1

為顧客1添加一項年齡屬性

$ curl -X POST "localhost:9200/customer/doc/1/_update?pretty" -H 'Content-Type: application/json' -d' { "doc": { "name": "Jane Doe", "age": 20 } } ' 
  • 1
  • 2
  • 3
  • 4
  • 5

刪除“customer”索引

$ curl -X DELETE "localhost:9200/customer?pretty" 
  • 1

查看現有的所有索引

$ curl -X GET "localhost:9200/_cat/indices?v" 
  • 1

批處理

_bulkAPI 可以幫助我們一次進行多項操作。添加兩個顧客 John Doe 和 Jane Doe

$ curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d' {"index":{"_id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" } ' 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

將顧客1的名字改為 Jane Done, 並刪除顧客2的信息

$ curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d' {"update":{"_id":"1"}} {"doc": { "name": "John Doe becomes Jane Doe" } } {"delete":{"_id":"2"}} ' 
  • 1
  • 2
  • 3
  • 4
  • 5

查詢

上面已經介紹了如何使用 curl 進行簡單的查詢。若要對數據進行復雜查詢與分析,推薦結合使用 Kibana。

kibana簡介

Kibana是一個與Elasticsearch協同工作的開源分析和可視化平台,Kibana 可以讓你更方便地對 Elasticsearch 中數據進行操作,包括高級的數據分析以及在圖表中可視化您的數據。

安裝

Kibana 的主版本號和次版本號不要超過 Elasticsearch,最好使用同版本號的 Kibana 與 Elasticsearch。

下載 Kibana 6.0.1壓縮包並解壓

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz $ tar -xzf kibana-6.0.1-linux-x86_64.tar.gz 
  • 1
  • 2

啟動

$ cd kibana-6.0.1-linux-x86_64/ $ ./bin/kibana 
  • 1
  • 2

Kibana 默認運行在 5601 端口,打開瀏覽器訪問 localhost:5601 即可看到 Kibana 控制台,打開 Dev Tools 便簽欄即可與 Elasticsearch 進行交互。

准備數據

在體驗Kibana之前先讓我們准備一些更加復雜的數據,以便更好地體現出Kibana的效果。官網上有三個數據集可供使用:shakespeare.json、accounts.zip、logs.jsonl.gz。這里我們選擇其中的accounts.ziplogs.jsonl.gz

下載完成后需要解壓

$ unzip accounts.zip
$ gunzip logs.jsonl.gz
  • 1
  • 2

在我們導入數據集前,需要先指定一些數據域的屬性。

logs 數據的結構很復雜,此次示例我們只關心以下幾個域:

{ "memory": INT, "geo.coordinates": "geo_point" "@timestamp": "date" } 
  • 1
  • 2
  • 3
  • 4
  • 5

在 Kibana的Dev Tools 控制台中輸入一下命令對其中某些域指定特性:

PUT /logstash-2015.05.18
{ "mappings": { "log": { "properties": { "geo": { "properties": { "coordinates": { "type": "geo_point" } } } } } } } PUT /logstash-2015.05.19 { "mappings": { "log": { "properties": { "geo": { "properties": { "coordinates": { "type": "geo_point" } } } } } } } PUT /logstash-2015.05.20 { "mappings": { "log": { "properties": { "geo": { "properties": { "coordinates": { "type": "geo_point" } } } } } } } 
  • 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

accounts 數據不需要指定域特性,現在我們已經准備好了,可以向 Elasticsearch 導入數據了,在放有三個解壓好的數據文件的同級目錄下運行以下shell命令:

curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl 
  • 1
  • 2

等待數據導入完成,再看一眼是否導入成功:

GET /_cat/indices?v
  • 1

制定索引模式

在正常的使用過程中,你的Elasticsearch庫中可能有非常多的索引,通過制定一些索引模式(即含有統配符的索引名匹配模板)可以在進行檢索時有效地制定搜索的范圍。在Kibana的 Management 標簽欄下添加新的索引模式,這里我們添加了兩個索引模式:ba*、logstash*

shakespeare和accounts數據都是沒有時間信息的,所以在添加shakes*和ba*索引模式時“Index contains time-based events box ”一欄應該置為空,logs數據集帶有時間信息,在添加logstash-*索引模式時在這一項選擇“@timestamp”。

索引模式可以自由制定,但必須保證所添加的索引模式能夠匹配到Elasticsearch中現有的某些索引,並且這些索引中還必須有數據。

在控制台輸入 GET _cat/indices 可以查看 Elasticsearch中現存的所有索引。

檢索

進入 Kibana 的 Discover 標簽欄,通過在頂部的搜索框中輸入 Elasticsearch 查詢語句可以對數據進行各種檢索。當前使用的索引模式顯示在搜索欄下面,Elasticsearch只會在與當前的索引模式相匹配索引中執行搜索。

舉個例子,將當前的索引模式選擇為 ba*,並在頂部的搜索欄中輸入:

account_number:<100 AND balance:>47500 
  • 1

來查詢 accounts 數據中 accounts_number 屬性小於100,並且balance屬性大於47500的文檔。

在這里插入圖片描述

可以看到一共有五條文檔符合我們的檢索要求,Kibana默認會列出所有匹配文檔的所有域,通過將鼠標懸停在相關域點擊后面的“add”按鈕可以要查看的域進行篩選。

數據可視化

在 Kibana 的 Visualize 標簽欄下對你的數據進行可視化。

例:點擊“Create a visualization”新建一個數據視圖。Kibana 提供了多種數據視圖,這里我們選擇餅圖,再選擇索引模式ba*。

在初始的默認值下,所有的文檔都被匹配上了,所以我們看到的是一個單色的餅圖。這里我們使用Buckets聚合來將對數據的balance進行一下分析:

1.點擊“Split Slices”按鈕

2.在Aggregation列表中選擇Range選項

3.在Field列表中選擇balance選項

4.通過點擊“Add Range”按鈕,制定6個區間

5.每個區間的范圍值如下

0 999
1000 2999
3000 6999
7000 14999
15000 30999
31000 50000

6.點擊“Apply changes”顯示分析結果

在這里插入圖片描述

下面讓我進行更進一步的分析,通過以下操作,我們來分析一下每個 balance range中開戶人的年齡分布情況:

1.點擊bucket列表下的“Add sub-buckets”按鈕,新建一列子buckets

2.點擊“Split Slices”按鈕

3.在Aggregation列表中選擇“Term”選項

4.在Field列表中選擇age選項

5.在Order By中選擇metric:Count選項

6.在Order中選擇Descending,Size默認為5

7.點擊“Apply changes”顯示分析結果

在這里插入圖片描述

將鼠標懸停在相關區域可以顯示更多信息,在Custom Label欄中可以為我們的坐標起名字,點擊右上角的Save按鈕可以保存我們的視圖。

下面我們來對log數據進行一些分析:

1.點擊左上角的Visualize按鈕,回到Visualize標簽欄的根目錄,添加一個新的視圖

2.選擇Coordinate Map 視圖

3.選擇logstash-*索引模式

4.點擊右上角的時間信息,打開時間過濾器

5.我們選擇查看2015.5.18到2015.5.20的信息

在這里插入圖片描述

6.點擊Go按鈕,應用我們的時間過濾器

7.在buckets中選擇Geo Coordinate指定我們要查詢的內容,並點擊Apply changes使查詢生效

在這里插入圖片描述

Kibana還支持繪制直方圖,折線圖等多種多樣的視圖以及更高級的數據可視化功能。

更多詳情請參考:

Elasticsearch官方文檔

Kibana官方文檔

可能遇到的問題

can not run elasticsearch as root

切換到非root用戶

main ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)

改變elasticsearch文件夾所有者到當前用戶:

$ sudo chown -R user_name elasticsearch


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM