本文以 Elasticsearch 6.2.4為例。
注:截止到2018-09-23的 Elasticsearch 是 6.4.1。5.x系列和6.x系列雖然有些區別,但基本用法是一樣的。
官方文檔:
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/
安裝
安裝比較簡單。分兩步:
- 配置JDK環境
- 安裝Elasticsearch
Elasticsearch 依賴 JDK環境,需要系統先下載安裝 JDK 並配置 JAVA_HOME 環境變量。JDK 版本推薦:1.8.0系列。地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
安裝JDk
Linux:
$ yum install -y java-1.8.0-openjdk
配置環境變量,需要修改/etc/profile, 增加:
CopyJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar JAVACMD=/usr/bin/java export JAVA_HOME JAVACMD CLASSPATH PATH
然後使之生效:
source /etc/profile
Windows:
安裝包地址:
http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-windows-x64.exe
下載並配置JDK環境變量
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_101 CLASSPATH=.;%JAVA_HOME%\lib;.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
安裝Elasticsearch
Elasticsearch 安裝只需要下載二進制壓縮包包,解壓即可使用。需要特別注意的是版本號,如果還要安裝Kibana及插件,需要注意選用一樣的版本號。
安裝包下載:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
這個頁面有 Elasticsearch 所有版本的下載:https://www.elastic.co/downloads/past-releases
下載後解壓到指定目錄,進入到 bin 目錄,就可以運行 Elasticsearch 了:
Linux:
./elasticsearch
Windows:
elasticsearch.bat
Windows也可以安裝為系統服務:
D:\work\elk\elasticsearch-6.2.4\bin>elasticsearch-service.bat Usage: elasticsearch-service.bat install|remove|start|stop|manager [SERVICE_ID] elasticsearch-service.bat install elasticsearch-service.bat start elasticsearch-service.bat stop elasticsearch-service.bat remove
瀏覽器訪問:http://127.0.0.1:9200,如果返回version等信息,說明安裝成功。
注: Linux/Mac環境不能使用 root 用戶運行。
Dev Tools
我們可以使用curl或者kibana提供的Dev Tools進行API測試。
例如:
curl方式:
curl 'localhost:9200/_cat/health?format=json' [{"epoch":"1537689647","timestamp":"16:00:47","cluster":"elasticsearch","status":"yellow","node.total":"1","node.data":"1","shards":"11","pri":"11","relo":"0","init":"0","unassign":"11","pending_tasks":"0","max_task_wait_time":"-","active_shards_percent":"50.0%"}]
Dev Tools:
GET /_cat/health?format=json
個人比較喜歡Kibana提供的Dev Tools,非常方便。如果沒有安裝,參考下面安裝:
a. 下載kibana Windows版:
https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-windows-x86_64.zip
b. 解壓後進kibana-6.2.4-windows-x86_64\bin目錄,運行kibana.bat即可:
D:\work\elk\kibana-6.2.4-windows-x86_64\bin>kibana.bat log [02:52:17.243] [info][status][plugin:[email protected]] Status changed from uninitialized to gree n - Ready log [02:52:17.869] [info][status][plugin:[email protected]] Status changed from uninitialized to yellow - Waiting for Elasticsearch log [02:52:17.880] [info][status][plugin:[email protected]] Status changed from uninitialized to gre en - Ready log [02:52:17.888] [info][status][plugin:[email protected]] Status changed from uninitialized to gre en - Ready log [02:52:18.165] [info][status][plugin:[email protected]] Status changed from uninitialized to gr een - Ready log [02:52:18.200] [info][listening] Server running at http://localhost:5601 log [02:52:18.268] [info][status][plugin:[email protected]] Status changed from yellow to gree n - Ready
c. 瀏覽器訪問: http://127.0.0.1:5601
查看_cat命令:
GET _cat
=^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/tasks /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} /_cat/recovery /_cat/recovery/{index} /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/{alias} /_cat/thread_pool /_cat/thread_pool/{thread_pools} /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields} /_cat/nodeattrs /_cat/repositories /_cat/snapshots/{repository} /_cat/templates
以下測試均在Dev Tools執行。
節點操作
查看健康狀態
CopyGET /_cat/health?format=json
format=json 表示輸出json格式,默認是文本格式。
結果:
[ { "epoch": "1537689915", "timestamp": "16:05:15", "cluster": "elasticsearch", "status": "yellow", "node.total": "1", "node.data": "1", "shards": "11", "pri": "11", "relo": "0", "init": "0", "unassign": "11", "pending_tasks": "0", "max_task_wait_time": "-", "active_shards_percent": "50.0%" } ]
健康狀態有3種:
- Green - 正常(集群功能齊全)
- Yellow - 所有數據均可用,但尚未分配一些副本(群集功能齊全)
- Red - 某些數據由於某種原因不可用(群集部分功能可用)
注意:當群集為紅色時,它將繼續提供來自可用分片的搜索請求,但您可能需要儘快修復它,因為存在未分配的分片。
查看節點
GET /_cat/nodes?format=json
索引
創建index
PUT /customer
輸出:
{ "acknowledged": true, "shards_acknowledged": true, "index": "customer" }
注:實際項目裡一般是不會直接這樣創建 index 的,這裡僅為演示。一般都是通過創建 mapping 手動定義 index 或者自動生成 index 。
查看所有index
GET /_cat/indices?format=json
結果:
[ { "health": "yellow", "status": "open", "index": "customer", "uuid": "AC4WMuViTguHDFtCRlXLow", "pri": "5", "rep": "1", "docs.count": "0", "docs.deleted": "0", "store.size": "1.1kb", "pri.store.size": "1.1kb" } ]
刪除index
DELETE /customer
輸出:
{ "acknowledged": true }
注:刪除索引會把數據一併刪除。實際操作請謹慎。
簡單的增刪改查
本文只講解簡單的增刪改查。
ES文檔有一些缺省字段,稱之為Meta-Fields,例如_index、_type、_id等,查詢文檔的時候會返回。
按ID新增數據
type為doc:
PUT /customer/doc/1 { "name": "John Doe" }
PUT /customer/doc/2 { "name": "yujc", "age":22 }
如果索引index不存在,直接新增數據也會同時創建index。
同時,該操作也能修改數據:
PUT /customer/doc/2 { "name": "yujc2" }
name字段會被修改,而且_version會被修改為2。該操作實際是覆蓋數據:
GET /customer/doc/2
結果:
{ "_index": "customer", "_type": "doc", "_id": "2", "_version": 2, "found": true, "_source": { "name": "yujc2" } }
按ID查詢數據
GET /customer/doc/1
結果:
{ "_index": "customer", "_type": "doc", "_id": "1", "_version": 1, "found": true, "_source": { "name": "John Doe" } }
直接新增數據
我們也可以不指定文檔ID從而直接新增數據:
POST /customer/doc { "name": "yujc", "age":23 }
注意這裡使用的動作是POST。PUT新增數據必須指定文檔ID。
按ID更新數據
我們使用下面兩種方式均能更新已有數據:
PUT /customer/doc/1 { "name": "yujc2", "age":22 } POST /customer/doc/1 { "name": "yujc2", "age":22 }
以上操作均會覆蓋現有數據。
更新部分字段(_update)
如果只是想更新指定字段,必須使用POST加參數的形式:
POST /customer/doc/1/_update { "doc":{"name": "yujc"} }
其中_update表示更新。json裡doc必須有,否則會報錯。
增加字段:
POST /customer/doc/1/_update { "doc":{"year": 2018} }
就會在已有的數據基礎上增加一個year字段,不會覆蓋已有數據:
GET /customer/doc/1
結果:
{ "_index": "customer", "_type": "doc", "_id": "1", "_version": 16, "found": true, "_source": { "name": "yujc", "age": 22, "year": 2018 } }
也可以使用簡單腳本執行更新。此示例使用腳本將年齡增加5:
POST /customer/doc/1/_update { "script":"ctx._source.age+=5" }
結果:
{ "_index": "customer", "_type": "doc", "_id": "1", "_version": 17, "found": true, "_source": { "name": "yujc", "age": 27, "year": 2018 } }
按ID刪除數據
DELETE /customer/doc/1
查詢mapping
GET /customer/_mapping
輸出:
{ "customer": { "mappings": { "doc": { "properties": { "age": { "type": "long" }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
說明:properties表示字段,這裡一共有2個字段(ES自動創建的):
- age,類型是long(支持檢索)
- name,類型是text(支持檢索、分詞);且額外增加了一個字段name.keyword,類型是keyword(支持檢索)。
以上具體到後面講解。
拓展知識:
注:ElasticSearch裡面有 index 和 type 的概念:index稱為索引,type為文檔類型,一個index下面有多個type,每個type的字段可以不一樣。這類似於關係型數據庫的 database 和 table 的概念。但是,ES中不同type下名稱相同的filed最終在Lucene中的處理方式是一樣的。所以後來ElasticSearch團隊想去掉type,於是在6.x版本為了向下兼容,一個index只允許有一個type。預計7.x版本徹底去掉type。參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
所以,實際使用中建議一個index裡面僅有一個type,名稱可以和index一致,或者使用固定的doc。
批量接口
批量創建
POST /customer/doc/_bulk {"index":{"_id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" }
該操作會新增2條記錄,其中文檔第1行和第3行提供的是要操作的文檔id,第2行和第4行是相應的源文檔,即數據內容。這裡對文檔的操作是index,也可以是create,二者都是創建文檔,只是如果文檔已存在,index會覆蓋,create會失敗。
查詢數據:
GET /customer/doc/2
結果:
{ "_index": "customer", "_type": "doc", "_id": "2", "_version": 2, "found": true, "_source": { "name": "Jane Doe" } }
批量更新、刪除
POST /customer/doc/_bulk {"update":{"_id":"1"}} {"doc": { "name": "John Doe becomes Jane Doe" } } {"delete":{"_id":"2"}}
該操作會更新ID為1的文檔,刪除ID為2的文檔。對於刪除操作,之後沒有相應的源文檔,因為刪除只需要刪除文檔的ID。
注意:批量操作如果某條失敗了,並不影響下一條繼續執行。
按條件更新
curl -X POST http://127.0.0.1:9200/test/doc/_update_by_query -H "Content-Type: application/json" -d '{"script":{"source":"ctx._source["is_pub"]=1"},"query":{"match_all":{}}}'
這個示例的含義是將文檔test/doc的所有文檔的is_pub字段設置為1。
按條件刪除
curl -X POST http://127.0.0.1:9200/test/doc/_delete_by_query -H "Content-Type: application/json" -d '{"query":{"bool":{"filter":{"range":{"id":{"gt":1661208}}}}}}'
這個示例的含義是將文檔test/doc裡字段 id 符合id>1661208的全部刪除。
參考
1、Getting Started | Elasticsearch Reference [6.2] | Elastic
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/getting-started.html
2、Elasticsearch 5.x 關於term query和match query的認識 - wangchuanfu - 博客園
https://www.cnblogs.com/wangchuanfu/p/7444253.html
(本文完)
本文優先在公眾號"飛鴻影的博客(fhyblog)"發佈,歡迎關注公眾號及時獲取最新文章推送!