ElasticSearch學習之Es索引Api操作
Es索引Api操作
在操作之前,先給大傢簡單的說下索引
,在es中,默認所有數據都會建立索引,我們可以類比它是數據庫中的庫
,這裡需要提示的是所有的索引index
都必須要小寫
。
創建索引
語法:
PUT /${idnexName}
運行:
PUT /test
輸出:
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "test" }
這樣我們就創建瞭test
索引,建完之後,我們可以到manager
也就是控制臺左下角的設置圖標,點擊之後進入索引管理
,這樣我們就看到瞭剛剛建的索引,也可以查看的它的一些信息
索引別名
有時候,我們的索引非常多,管理起來就會變的麻煩,es
為我們提供瞭aliases
,也就是別名
,我們可以簡單的理解為對“`index““做的標記,它可以是一對一,也可以是一對多,下面就給大傢演示一下,如何添加
語法:
POST _aliases
這裡給大傢舉個例子,比如年級,一到六年級的索引可能是class_1,class_2,class_3,class_4,class_5,class_6
,我們在起別名的時候,也不是亂起的,在規范中,建議使用有意義的字段使其歸為子集,比如可以統一叫做class
添加索引別名
一對一:
POST _aliases { "actions":[ { "add":{ "index":"class_1", "alias":"class" } } ] }
一對多,這裡指的是一個別名對應多個索引:
POST _aliases { "actions":[ { "add":{ "indices":[ "class_1", "class_2" ], "alias":"class" } } ] }
多對一,這裡指的多個別名對應一個索引:
POST _aliases { "actions":[ { "add":{ "index":"class", "aliases":[ "class_1", "class_2" ] } } ] }
輸出:
{ "acknowledged" : true }
查詢索引別名
語法:
GET ${indexName}/_alias
查詢class_1:
GET /class_1/_alias
輸出:
{ "class_1" : { "aliases" : { "class" : { } } } }
刪除索引別名
其實很簡單,隻需要把add
改為 remove
就好瞭,舉個例子,刪除class_1的索引別名:
- 一對一
POST _aliases { "actions":[ { "remove":{ "index":"class_1", "alias":"class" } } ] }
我們在查詢一下:
{ "class_1" : { "aliases" : { } } }
可以看到已經被我們刪掉瞭
一對多
POST _aliases { "actions":[ { "remove":{ "indices":[ "class_1", "class_2" ], "alias":"class" } } ] }
多對一
POST _aliases { "actions":[ { "remove":{ "index":"class", "aliases":[ "class_1", "class_2" ] } } ] }
這裡就不帶大傢一一輸出瞭,自己試著運行一下。接著我們繼續看剩下的兩個屬性~
mapping
這個mapping
是什麼意思呢?字面理解好像是映射,那麼它映射什麼?我們以mysql
為例,在創建表的時候,會對字段進行聲明,比如字段名稱,字段大小以及類型等等,在es中,同樣會對文檔的字段進行聲明,包括字段類型,所否分詞,是否索引,分詞規則等多種屬性,mapping
就是提供這個作用的,所以這個大傢要先理解。
es中提供瞭動態mapping
以及靜態mapping
兩種方式來聲明一個類型中文檔的字段,mapping
的屬性有很多,這個後邊給大傢整理好,本節先帶大傢體驗一下如何操作
settings
setting
屬性用於設置當前索引的分片數,副本數等信息,常用的主要有:
index.number_of_shards
:索引分片數
index.number_of_replicas
:索引副本數
index.refresh_interval
: refresh頻率,默認1s。當數據對實時刷新要求不那麼高時,可以適當調大改值。當值=-1時,代表不會進行refresh操作,但是請保證es的虛擬機內存足夠大,不然會造成內存溢出
常見設置:
PUT class_1 { "settings":{ "index":{ "number_of_shards":3, "number_of_replicas":1, "refresh_interval":"3s" } } }
下面我們看下完整的索引創建:
PUT class_1 { "aliases":{ "class":{ } }, "mappings":{ "properties":{ "num":{ "type":"long" }, "name":{ "type":"text", "fields":{ "keyword":{ "type":"keyword", "ignore_above":256 } } } } }, "settings":{ "index":{ "refresh_interval":"3s", "number_of_shards":"3", "number_of_replicas":"1" } } }
有幾個mapping的屬性給大傢說下:
fields
這個屬性的意思是·多字段屬性
,讓一個字段擁有多個子字段類型,使得一個字段能夠被多個不同的索引方式進行索引,keyword
不會做分詞處理。類型為keyword
的字段隻能通過精確值搜索到。類型適用於索引結構化的字段,在Elasticsearch 5.X 之後的字段類型不再支持 string,由 text 或 keyword 取代。如果仍使用 string,會給出警告。ignore_above
: keyword,text類型字段都可以設置ignore_above屬性(默認是10) ,表示最大的字段值長度,*超出這個長度的字段將不會被索引,但是會存儲,ignore_above一般設置為256,設置為30000可能會出現BulkFailureException
查詢索引
上邊我們講的是創建,下面我們看下怎麼查詢
查詢當前集群全部索引
語法:
GET _cat/indices?v
輸出:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana_task_manager_1 RN3mjh1qRbi7wnHnZAvD1g 1 1 2 0 77.8kb 41.8kb green open .apm-agent-configuration FFRPssv0SLGYNSh5_OGPeA 1 1 0 0 566b 283b green open kibana_sample_data_logs E2e-LpmvSwm62txGvhl3Ow 1 1 14074 0 21.7mb 10.7mb green open class_1 UGsT0F5nQa-p68I7NbBWqg 3 1 0 0 1.1kb 690b green open .kibana_1 2bvqPg7nSiSqKahUdJuevw 1 1 51 4 284.4kb 143.1kb
查詢單個索引
GET class_1
會輸出一段json描述信息:
{ "class_1" : { "aliases" : { "class" : { } }, "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "num" : { "type" : "long" } } }, "settings" : { "index" : { "refresh_interval" : "3s", "number_of_shards" : "3", "provided_name" : "class_1", "creation_date" : "1670811044703", "number_of_replicas" : "1", "uuid" : "UGsT0F5nQa-p68I7NbBWqg", "version" : { "created" : "7060299" } } } } }
有時候索引字段非常多的時候,如果我們想查詢索引的單個字段,怎麼做呢?
- 隻查詢
mapping
GET /class_1/_mapping
輸出:
{ "class_1" : { "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "num" : { "type" : "long" } } } } }
- 隻查詢
settings
:
GET /class_1/_settings
輸出:
{ "class_1" : { "settings" : { "index" : { "refresh_interval" : "3s", "number_of_shards" : "3", "provided_name" : "class_1", "creation_date" : "1670811044703", "number_of_replicas" : "1", "uuid" : "UGsT0F5nQa-p68I7NbBWqg", "version" : { "created" : "7060299" } } } } }
修改索引
不同於mysql
,你可以通過一個update
把表的字段改掉,當然當你數據量很小的時候。在es中,es基於lucene,而lucene中的每個segment都具有不變性。因此每個Index一旦創建完成就不可修改。那怎麼做呢?修改的另一種方式叫做數據遷移
,也就是通過建立新索引,舊數據遷移到新索引的形式更新索引,在mysql
中,有時在無法改變原表結構的時候,我們也是通過這種方式進行的。下面通過一個例子給大傢體會下:
語法:
POST _reindex { "source":{ "index":"oldIndex" }, "dest":{ "index":"newIndex" } }
首先創建class_2
PUT class_2
將class_1轉移到class_2上:
POST _reindex { "source":{ "index":"class_1" }, "dest":{ "index":"class_2" } }
查詢之後發現class_2
並沒有發生什麼結構變化,在這之前我們創建點數據,然後在遷移,這樣看的比較明顯一點,向class_1插入數據, 文檔操作後邊會給大傢講,先簡單操作一下:
GET /class_1/_doc/ { "name":"一年級", "num": 20 }
然後再執行_reindex
, 查詢class_2
輸出:
{ "class_2" : { "aliases" : { "class" : { } }, "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "num" : { "type" : "long" } } }, "settings" : { "index" : { "creation_date" : "1670811901557", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "PvK25pp6Tu6A0CiMpArRZQ", "version" : { "created" : "7060299" }, "provided_name" : "class_2" } } } }
我們發現,class_1
的屬性都被轉移到瞭class_2
上
刪除索引
語法:
DELETE ${indexName}
我們刪除舊索引class_1
DELETE class_1
在查詢,發現已經找不到class_1
瞭
想刪除多個怎麼辦呢? 方法如下:
DELETE ${indexName}, ${indexName}
結束語
本節主要講瞭索引
相關的api操作,索引作為數據基石,顯得尤為重要,所以大傢在學習的時候,特別是創建索引,一定要多去理解和練習,好比我們在數據庫中建表一樣,第一步都很重要,因為這個直接影響到你後邊生產的數據,所以,在下節,我會給大傢好好理一下mapping
。
推薦閱讀:
- es創建索引和mapping的實例
- ElasticSearch學習之Es集群Api操作示例
- elasticsearch bucket 之rare terms聚合使用詳解
- Elasticsearch 映射參數詳解 fields
- 使用logstash同步mysql數據到elasticsearch實現