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

