Elasticsearch入門,看這一篇就夠了

雙子孤狼發表於2021-05-17

前言

Elasticsearch 是由 Shay Banon 發起的一個開源的分散式搜尋服務,自 20102 月釋出以來,該專案已發展成為搜尋和資料分析解決方案領域中極其重要的一員,廣泛應用於各大網站。

視覺化工具

正如關係型資料庫一樣,我們使用 Elasticsearch 時也需要一款視覺化工具,最常用的就是 kibana,而這也是 ELK 組建中的 K,剩下的 L 就是 Logstash

kibana

Kibana 是一款非常強大的工具,使用 kibana,我們可以做以下三件事:

  1. 搜尋,觀察和保護: 從發現文件到分析日誌再到發現安全漏洞,Kibana是您訪問這些功能及其他功能的門戶。
  2. 視覺化即資料分析:分析在圖表,儀表,地圖等發現的資料,並將它們組合到儀表板。
  3. 管理監控即保護 Elastic Stack:管理索引和提取管道,監視Elastic Stack叢集的執行狀況,並控制哪些使用者可以訪問哪些功能。

kibana 的安裝

kibana 的安裝也比較簡單,點選這裡下載對應版本,並進行解壓,解壓後的主目錄即為 $KIBANA_HOME 路徑:

同樣的,我們需要進入 config 目錄下,修改 kibana 的配置檔案 kibana.yml

kibana 配置

Elasticsearch 一樣,安裝好 kibana 之後,我們也需要對其中一些重要的配置檔案進行配置:

  • elasticsearch.hosts

配置需要連線的 Elasticsearch 服務,如果配置多個服務,則必須屬於同一個 Elasticsearch 叢集,預設值為:

elasticsearch.hosts: ["http://localhost:9200"]
  • server.name

標識當前 kibana 的唯一例項,預設是主機名,這個只是起到一個描述標識作用。

  • server.host

指定 kibana 的主機名,預設 localhost,表示只允許本機訪問。如果需要遠端連線,則需要將此配置修改為外網 ip 地址或者域名等非本地迴環地址,或者可以使用 0.0.0.0 允許所有遠端主機連線。

  • server.port

配置 kibana 的埠號,預設是 5601

  • elasticsearch.requestTimeout

等待後臺或者等待 Elasticsearch 響應的毫秒數,預設值為:30000.

  • elasticsearch.pingTimeout

等待 Elasticsearchping 的返回毫秒數,預設值等於 elasticsearch.requestTimeout 配置的時間。

  • elasticsearch.username 和 elasticsearch.password

如果 Elasticsearch 配置了賬號密碼,則需要在這裡配置上賬號和密碼。

  • path.data

Kibana 中儲存沒有儲存在 Elasticsearch 中的持久化資料的路徑。

  • logging.dest

指定 log 路徑,預設為 stdout

  • server.basePath

指定訪問 kibana 的基礎路徑,預設為 /,一般如果要通過 nginx 等中介軟體進行代理的話,會設定基礎路徑。

  • server.rewriteBasePath

重定向之後路徑是否保留 server.basePath 路徑,在 kibana 6.3 及更早的版本預設是 false,在 kibana 7.0 之後的版本中預設為 true

kibana 的啟動

配置完只要配置檔案之後,就可以進入 bin 目錄執行命令 ./kibana 啟動 kibana,如果想要在後臺啟動,則可以執行命令 ./kibana &

啟動之後就可以訪問 kibanahttp://ip:5601/{basePath}

訪問之後,開啟左邊的 Dev Tools,就可以開始執行屬於 Elasticsearch 的 "sql 語句" 進行增刪改查等操作了:

除了 Dev Tools 之外,kibana 還有許多其他強大的功能,大家可以自行去嘗試操作。

Elasticsearch 入門操作

經過一系列操作,終於可以開始操作 Elasticsearch 了,Elasticsearch 中的 API 遵循了 REST 風格,利用其提供的 REST API 可以管理索引,更改例項引數,檢查節點和叢集狀態,並且對索引中的文件資料資料進行 CRUD 操作。

操作 index

索引相當於資料庫,所以我們先來學習一下索引的基本操作。

建立 index

建立索引一般使用 PUT 方法:

PUT /my-index-001

如果有定義 mapping,則可以在建立索引的同時帶上 mapping

PUT /my-index-002
{
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  }
}

同時,建立索引的時候還可以給索引建立別名:

PUT /my-index-003
{
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  },
  "aliases": {
    "alias_name": {}
  }
}

有了別名之後,查詢索引可以使用別名進行查詢。

索引別名有什麼用

索引別名其實在某些場景的時候是非常有用的,比如當我們上線之後,如果因為某些業務變動,導致需要修改欄位,那麼這時候在 Elasticsearch 中就需要重建索引。重建索引的時候我們可以指定一個相同的別名,而如果我們的程式碼中就是通過別名進行查詢時,這時候重建索引後就可以實現無縫銜接了。

刪除索引

刪除索引採用 DELETE 方法。

DELETE /my-index-0001

查詢索引

查詢索引資訊採用 GET 方法,這個可以返回索引的 settingmappingaliases 以及分片等資訊。

GET /my-index-001

exist 索引

判斷索引是否存在,採用的是 HEAD 方法。

HEAD /my-index-001
  • clone index

克隆索引之前,必須要先把一個索引改成只讀(同時需保證叢集狀態為綠色):

PUT /my-index-004/_settings
{
  "settings": {
    "index.blocks.write": true
  }
} 

改成只讀後,就可以使用 POST 方法進行克隆索引:

POST /my-index-004/_clone/cloned-my-index-004

操作 document

學會了 index 的基本操作,接下來就就可以學習一下 document(資料) 的基本操作。

插入 document

插入 document 採用的是 POST 方法:

POST /my-index-001/_doc/?pretty{  "@timestamp": "2099-11-15T13:12:00",  "message": "GET /search HTTP/1.1 200 1070000",  "user": {    "id": "kimchy"  }}

上面的語句中因為沒有生成 id,所以 Elasticsearch 會自動生成一個 id 值。

插入指定 id 文件,則可以使用 _resource 語句:

PUT my-index-001/_create/1{  "@timestamp": "2099-11-15T13:12:00",  "message": "GET /search HTTP/1.1 200 1070000",  "user": {    "id": "kimchy"  }}

或者指定 op_type=create

PUT my-index-001/_doc/2?op_type=create{  "@timestamp": "2099-11-15T13:12:00",  "message": "GET /search HTTP/1.1 200 1070000",  "user": {    "id": "kimchy"  }}

查詢 document

簡單的查詢語句可以使用 GET 方法:

GET /my-index-001/_search

查詢之後得到如下結果(我們的源資料在 hits 裡面,外面的欄位是 Elasticsearch 自帶的通用欄位):

如果想只查詢特定 id 文件則可以使用如下語句:

GET /my-index-001/_doc/1

而如果我們想指定返回欄位或者指定不返回欄位,則可以使用 _source 等引數(下面這句話則表示只返回 *.id 的欄位且不返回 @timestamp 欄位):

GET my-index-001/_doc/1?_source_includes=*.id&_source_excludes=@timestamp

有些有時候如果針對我們自己儲存的欄位,一個都不想返回,則可以使用如下語句:

GET my-index-001/_doc/1?_source=false

刪除 document

刪除文件使用 DELETE 方法,刪除語法為:DELETE /<index>/_doc/<_id>

指定 id 刪除,超時時間為 5 分鐘:

DELETE /my-index-001/_doc/1?timeout=5m

如果想刪除所有欄位,則可以使用 delete_by_query 語句:

POST my-index-001/_delete_by_query{  "query": {    "match_all": {}  }}

同樣的,delete_by_query 也可以指定條件刪除:

POST /my-index-001/_delete_by_query{  "query": {    "match": {      "user.id": "elkbee"    }  }}

更新 document

更新 document 一般使用 POST 方法,使用 _update 型別,下面我們來演示一個更新語句:

  • 插入一條資料到 test 索引:
PUT test/_doc/1{  "name":"雙子孤狼",  "age":18,  "address":"廣東深圳"}
  • name 欄位進行更新:
POST test/_update/1{  "doc": {    "name": "雙子孤狼2"  }}
  • 執行查詢語句 GET test/_search 進行查詢,則發現 name 欄位已被更新:

使用指令碼更新 document

更新語句還可以使用 script 來實現更靈活的操作(如下則表示將 age 欄位增加 4):

POST test/_update/1{  "script" : {    "source": "ctx._source.age += params.count",    "lang": "painless",    "params" : {      "count" : 4    }  }}

delete_by_query 語句一樣,更新語句也可以使用 update_by_query 語句:

POST test/_update_by_query{  "script": {    "source": "ctx._source.age += params.count",    "lang": "painless",    "params" : {      "count" : 4    }  },  "query": {    "match": {      "name": "雙子孤狼2"    }  }}

reindex 操作

有時候我們需要將一個索引的資料複製到另一個索引,那麼這時候就可以使用 reindex 操作,這個操作和前面的 clone 操作的區別是 reindex 操作只會遷移文件資料,而不會將 settingmapping以及分片等資訊遷移到新索引,而且在執行 reindex 操作時不需要將舊索引設定為只讀狀態。

POST _reindex?wait_for_completion=false{  "source": {    "index": "old-index"  },  "dest": {    "index": "new-index"  }}

wait_for_completion 引數預設為 true,表示當前操作會一直阻塞直到成功為止,如果到了超時時間還沒有完成則會報錯,所以如果資料量比較大可以修改 wait_for_completion 引數為 false

總結

本文主要介紹了 kibana 的安裝及一些主要的配置,並通過 kibana 介紹了 Elasticsearch 中對 indexdocument 的一些基本的增刪改查操作。當然,如果想要深入使用 Elasticsearch,這些語句是遠遠不夠的,Elasticsearch 的一些高階查詢及分析語句才是 Elasticsearch 的核心。

相關文章