Elasticsearch入門,看這一篇就夠了


前言

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 的核心。


免責聲明!

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



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