ElasticSearch學(xué)習(xí)之Es索引Api操作
Es索引Api操作
在操作之前,先給大家簡(jiǎn)單的說(shuō)下索引
,在es中,默認(rèn)所有數(shù)據(jù)都會(huì)建立索引,我們可以類比它是數(shù)據(jù)庫(kù)中的庫(kù)
,這里需要提示的是所有的索引index
都必須要小寫
。
創(chuàng)建索引
語(yǔ)法:
PUT /${idnexName}
運(yùn)行:
PUT /test
輸出:
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "test" }
這樣我們就創(chuàng)建了test
索引,建完之后,我們可以到manager
也就是控制臺(tái)左下角的設(shè)置圖標(biāo),點(diǎn)擊之后進(jìn)入索引管理
,這樣我們就看到了剛剛建的索引,也可以查看的它的一些信息
索引別名
有時(shí)候,我們的索引非常多,管理起來(lái)就會(huì)變的麻煩,es
為我們提供了aliases
,也就是別名
,我們可以簡(jiǎn)單的理解為對(duì)```index````做的標(biāo)記,它可以是一對(duì)一,也可以是一對(duì)多,下面就給大家演示一下,如何添加
語(yǔ)法:
POST _aliases
這里給大家舉個(gè)例子,比如年級(jí),一到六年級(jí)的索引可能是class_1,class_2,class_3,class_4,class_5,class_6
,我們?cè)谄饎e名的時(shí)候,也不是亂起的,在規(guī)范中,建議使用有意義的字段使其歸為子集,比如可以統(tǒng)一叫做class
添加索引別名
一對(duì)一:
POST _aliases { "actions":[ { "add":{ "index":"class_1", "alias":"class" } } ] }
一對(duì)多,這里指的是一個(gè)別名對(duì)應(yīng)多個(gè)索引:
POST _aliases { "actions":[ { "add":{ "indices":[ "class_1", "class_2" ], "alias":"class" } } ] }
多對(duì)一,這里指的多個(gè)別名對(duì)應(yīng)一個(gè)索引:
POST _aliases { "actions":[ { "add":{ "index":"class", "aliases":[ "class_1", "class_2" ] } } ] }
輸出:
{ "acknowledged" : true }
查詢索引別名
語(yǔ)法:
GET ${indexName}/_alias
查詢class_1:
GET /class_1/_alias
輸出:
{ "class_1" : { "aliases" : { "class" : { } } } }
刪除索引別名
其實(shí)很簡(jiǎn)單,只需要把add
改為 remove
就好了,舉個(gè)例子,刪除class_1的索引別名:
- 一對(duì)一
POST _aliases { "actions":[ { "remove":{ "index":"class_1", "alias":"class" } } ] }
我們?cè)诓樵円幌?
{ "class_1" : { "aliases" : { } } }
可以看到已經(jīng)被我們刪掉了
一對(duì)多
POST _aliases { "actions":[ { "remove":{ "indices":[ "class_1", "class_2" ], "alias":"class" } } ] }
多對(duì)一
POST _aliases { "actions":[ { "remove":{ "index":"class", "aliases":[ "class_1", "class_2" ] } } ] }
這里就不帶大家一一輸出了,自己試著運(yùn)行一下。接著我們繼續(xù)看剩下的兩個(gè)屬性~
mapping
這個(gè)mapping
是什么意思呢?字面理解好像是映射,那么它映射什么?我們以mysql
為例,在創(chuàng)建表的時(shí)候,會(huì)對(duì)字段進(jìn)行聲明,比如字段名稱,字段大小以及類型等等,在es中,同樣會(huì)對(duì)文檔的字段進(jìn)行聲明,包括字段類型,所否分詞,是否索引,分詞規(guī)則等多種屬性,mapping
就是提供這個(gè)作用的,所以這個(gè)大家要先理解。
es中提供了動(dòng)態(tài)mapping
以及靜態(tài)mapping
兩種方式來(lái)聲明一個(gè)類型中文檔的字段,mapping
的屬性有很多,這個(gè)后邊給大家整理好,本節(jié)先帶大家體驗(yàn)一下如何操作
settings
setting
屬性用于設(shè)置當(dāng)前索引的分片數(shù),副本數(shù)等信息,常用的主要有:
index.number_of_shards
:索引分片數(shù)
index.number_of_replicas
:索引副本數(shù)
index.refresh_interval
: refresh頻率,默認(rèn)1s。當(dāng)數(shù)據(jù)對(duì)實(shí)時(shí)刷新要求不那么高時(shí),可以適當(dāng)調(diào)大改值。當(dāng)值=-1時(shí),代表不會(huì)進(jìn)行refresh操作,但是請(qǐng)保證es的虛擬機(jī)內(nèi)存足夠大,不然會(huì)造成內(nèi)存溢出
常見(jiàn)設(shè)置:
PUT class_1 { "settings":{ "index":{ "number_of_shards":3, "number_of_replicas":1, "refresh_interval":"3s" } } }
下面我們看下完整的索引創(chuàng)建:
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" } } }
有幾個(gè)mapping的屬性給大家說(shuō)下:
fields
這個(gè)屬性的意思是·多字段屬性
,讓一個(gè)字段擁有多個(gè)子字段類型,使得一個(gè)字段能夠被多個(gè)不同的索引方式進(jìn)行索引,keyword
不會(huì)做分詞處理。類型為keyword
的字段只能通過(guò)精確值搜索到。類型適用于索引結(jié)構(gòu)化的字段,在Elasticsearch 5.X 之后的字段類型不再支持 string,由 text 或 keyword 取代。如果仍使用 string,會(huì)給出警告。ignore_above
: keyword,text類型字段都可以設(shè)置ignore_above屬性(默認(rèn)是10) ,表示最大的字段值長(zhǎng)度,*超出這個(gè)長(zhǎng)度的字段將不會(huì)被索引,但是會(huì)存儲(chǔ),ignore_above一般設(shè)置為256,設(shè)置為30000可能會(huì)出現(xiàn)BulkFailureException
查詢索引
上邊我們講的是創(chuàng)建,下面我們看下怎么查詢
查詢當(dāng)前集群全部索引
語(yǔ)法:
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
查詢單個(gè)索引
GET class_1
會(huì)輸出一段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" } } } } }
有時(shí)候索引字段非常多的時(shí)候,如果我們想查詢索引的單個(gè)字段,怎么做呢?
- 只查詢
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
,你可以通過(guò)一個(gè)update
把表的字段改掉,當(dāng)然當(dāng)你數(shù)據(jù)量很小的時(shí)候。在es中,es基于lucene,而lucene中的每個(gè)segment都具有不變性。因此每個(gè)Index一旦創(chuàng)建完成就不可修改。那怎么做呢?修改的另一種方式叫做數(shù)據(jù)遷移
,也就是通過(guò)建立新索引,舊數(shù)據(jù)遷移到新索引的形式更新索引,在mysql
中,有時(shí)在無(wú)法改變?cè)斫Y(jié)構(gòu)的時(shí)候,我們也是通過(guò)這種方式進(jìn)行的。下面通過(guò)一個(gè)例子給大家體會(huì)下:
語(yǔ)法:
POST _reindex { "source":{ "index":"oldIndex" }, "dest":{ "index":"newIndex" } }
首先創(chuàng)建class_2
PUT class_2
將class_1轉(zhuǎn)移到class_2上:
POST _reindex { "source":{ "index":"class_1" }, "dest":{ "index":"class_2" } }
查詢之后發(fā)現(xiàn)class_2
并沒(méi)有發(fā)生什么結(jié)構(gòu)變化,在這之前我們創(chuàng)建點(diǎn)數(shù)據(jù),然后在遷移,這樣看的比較明顯一點(diǎn),向class_1插入數(shù)據(jù), 文檔操作后邊會(huì)給大家講,先簡(jiǎn)單操作一下:
GET /class_1/_doc/ { "name":"一年級(jí)", "num": 20 }
然后再執(zhí)行_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" } } } }
我們發(fā)現(xiàn),class_1
的屬性都被轉(zhuǎn)移到了class_2
上
刪除索引
語(yǔ)法:
DELETE ${indexName}
我們刪除舊索引class_1
DELETE class_1
在查詢,發(fā)現(xiàn)已經(jīng)找不到class_1
了
想刪除多個(gè)怎么辦呢? 方法如下:
DELETE ${indexName}, ${indexName}
結(jié)束語(yǔ)
本節(jié)主要講了索引
相關(guān)的api操作,索引作為數(shù)據(jù)基石,顯得尤為重要,所以大家在學(xué)習(xí)的時(shí)候,特別是創(chuàng)建索引,一定要多去理解和練習(xí),好比我們?cè)跀?shù)據(jù)庫(kù)中建表一樣,第一步都很重要,因?yàn)檫@個(gè)直接影響到你后邊生產(chǎn)的數(shù)據(jù),所以,在下節(jié),我會(huì)給大家好好理一下mapping
。
相關(guān)文章
簡(jiǎn)單講解在Java編程中實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式結(jié)構(gòu)
這篇文章主要介紹了簡(jiǎn)單講解在Java編程中實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式結(jié)構(gòu),設(shè)計(jì)模式是最基本直白簡(jiǎn)單的一種設(shè)計(jì)模式,需要的朋友可以參考下2016-04-04Java使用Jdbc連接Oracle執(zhí)行簡(jiǎn)單查詢操作示例
這篇文章主要介紹了Java使用Jdbc連接Oracle執(zhí)行簡(jiǎn)單查詢操作,結(jié)合實(shí)例形式詳細(xì)分析了java基于jdbc實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)的連接與查詢相關(guān)操作技巧,需要的朋友可以參考下2019-09-09Spring Boot 項(xiàng)目創(chuàng)建的詳細(xì)步驟(圖文)
這篇文章主要介紹了Spring Boot 項(xiàng)目創(chuàng)建的詳細(xì)步驟(圖文),這里我們有兩種創(chuàng)建Spring Boot項(xiàng)目的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Java開(kāi)發(fā)環(huán)境配置JDK超詳細(xì)整理(適合新手入門)
這篇文章主要給大家介紹了關(guān)于Java開(kāi)發(fā)環(huán)境配置JDK超詳細(xì)整理的相關(guān)資料,非常適合新手入門,JDK是Java語(yǔ)言的軟件開(kāi)發(fā)工具包,主要用于移動(dòng)設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,需要的朋友可以參考下2023-11-11Java將文件分割為多個(gè)子文件再將子文件合并成原始文件的示例
本篇文章主要介紹了Java將文件分割為多個(gè)子文件再將子文件合并成原始文件的示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-02-02圖解Springboot集成七牛云并實(shí)現(xiàn)圖片上傳功能過(guò)程
在實(shí)際開(kāi)發(fā)中 ,基本都會(huì)有應(yīng)用到文件上傳的場(chǎng)景,但隨著或多或少的需求問(wèn)題,之前有在springboot上用過(guò)七牛云實(shí)現(xiàn)圖片上傳,今天因?yàn)槟承┰蛴种匦率褂昧讼缕吲T埔虼讼肟偨Y(jié)下七牛云2021-11-11詳解SpringBoot如何實(shí)現(xiàn)多環(huán)境配置
在實(shí)際的軟件開(kāi)發(fā)過(guò)程中,一個(gè)應(yīng)用程序通常會(huì)有多個(gè)環(huán)境,pring?Boot?提供了一個(gè)非常靈活和強(qiáng)大的方式來(lái)管理這些環(huán)境配置,下面就跟隨小編一起學(xué)習(xí)一下吧2023-07-07Java實(shí)現(xiàn)解析zip壓縮包并獲取文件內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)頁(yè)面上傳一個(gè)源碼壓縮包,后端將壓縮包解壓,并獲取每個(gè)文件中的內(nèi)容,感興趣的可以動(dòng)手嘗試一下2022-07-07