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

推薦閱讀: