Elasticsearch從入門到放棄:索引基本使用方法

前文咱們提到,Elasticsearch的數據都存儲在索引中,也就是說,索引至關因而MySQL中的數據庫。是最基礎的概念。今天分享的也是關於索引的一些經常使用的操做。html

建立索引

curl -X PUT "localhost:9200/jackey?pretty"
複製代碼

ES建立索引使用PUT請求便可,上面是最簡單的新建一個索引的方法,除此以外,你還能夠指定:數據庫

  • Settings
  • Mappings
  • aliases

索引名稱有如下限制:json

  1. 必須是小寫
  2. 不能包含:\,/,*, ?, ", <, >, |, (空格),,, #
  3. 在ES7.0之前索引名能夠包含冒號,可是7.0以後不支持了
  4. 不能以-,_+開頭
  5. 不能是...
  6. 長度不能超過255字節

請求支持的一些參數有:安全

  • wait_for_active_shards:繼續操做前,必須處於active狀態的分片數,默認是1,也能夠設置爲all或者不大於總分片數的任意正整數
  • timeout:設置等待響應的超時時間,默認是30秒
  • master_timeout:鏈接master節點響應的超時時間,默認是30秒

前面咱們提到建立索引時能夠指定三種屬性,這三種屬性都須要放在body中。bash

aliases

索引的別名,一個別名能夠賦給多個索引。app

給一個index起別名的方式有兩種,一種是建立index時候在body中增長aliases,另外一種是經過更新已有索引的方式增長。curl

方式一:elasticsearch

curl -X PUT "localhost:9200/jackey?pretty" -H 'Content-Type: application/json' -d' { "aliases" : { "alias_1" : {}, "alias_2" : { "filter" : { "term" : {"user" : "kimchy" } }, "routing" : "kimchy" } } } '
複製代碼

方式二:ide

curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d' { "actions" : [ { "add" : { "index" : "jackey", "alias" : "alias1" } } ] } '
複製代碼

方式一中,咱們還在body中增長了filter和routing。這主要是用於指定使用別名的條件。指定了filter後,經過alias_2,只能訪問user爲kimchy的document。而routing的值被用來路由,即alias_2只能路由到指定的分片。此外還有index_routing和search_routing,它們和routing相似,這裏不作過多解釋了。還有一個比較重要的屬性是is_write_index,這個屬性默認是false,若是設置成true,表示能夠經過這個別名來寫索引,默認狀況下,別名像一個軟連接,是不能夠修改原索引的。ui

此外,還可使用通配符爲多個索引增長相同的別名

curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d' { "actions" : [ { "add" : { "index" : "test*", "alias" : "all_test_indices" } } ] } '
複製代碼

除了add,還可使用remove來刪除別名

curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d' { "actions" : [ { "remove" : { "index" : "test1", "alias" : "alias1" } } ] } '
複製代碼

Settings

先看一個例子:

curl -X PUT "localhost:9200/twitter?pretty" -H 'Content-Type: application/json' -d' { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } '
複製代碼

索引的setting分爲靜態和動態兩種。靜態的只能在索引建立或關閉時設置;動態的則可使用update-index-settings API來實時設置。上面的例子中,number_of_shards屬於靜態設置,number_of_replicas屬於動態設置。

索引能夠設置的setting能夠在官方文檔的Index modules查看,下面我會挑幾個我認爲比較重要的介紹一下。

先從靜態開始:

  • index.number_of_shards:指定索引的分片數,只能在建立索引時設置。默認是1,最大能夠設置爲1024。這是出於安全考慮的一種保護措施。最大值能夠經過設置系統變量來控制export ES_JAVA_OPTS="-Des.index.max_number_of_shards=128"
  • index.routing_partition_size:能夠路由的分片數量,一樣只能在建立索引時指定,默認值爲1.這個值必須小於number_of_shards(除非number_of_shards的值也是1)

動態setting:

  • index.number_of_replicas:每一個分片的副本數,默認是1
  • index.auto_expand_replicas:基於數據節點能夠自動擴展的副本數,默認爲爲false。能夠設置爲一個區間,以短線分隔,例如「0-5」,也能夠設置成all。須要注意的是,副本的自動擴展並不會考慮其餘的分配規則。這有可能致使集羣狀態變成黃色
  • index.search.idle.after:分片被認爲搜索空閒以前沒有收到請求或搜索的時間。默認30秒。
  • index.refresh_interval:刷新操做的執行頻率,默認是1s。若是設置成-1,表示不會刷新。若是沒有顯式設置,分片在收到搜索請求前至少index.search.idle.after秒內不會後臺刷新
  • index.max_result_window:返回結果的最大數量,默認是10000(一萬)。搜索返回結果佔用的內存和時間受到這個值的限制
  • index.routing.rebalance.enable:是否容許分片的自平衡。默認是all,容許全部分片從新平衡。還能夠設置爲primaries,只容許主分片從新平衡。replicas只容許從分片從新平衡。none不容許分片從新平衡。

除了以上靜態setting和動態setting以外,setting中還能夠設置一些其餘的值,例如分詞器等,這些咱們之後再作更詳細的介紹。

Mappings

curl -X PUT "localhost:9200/test?pretty" -H 'Content-Type: application/json' -d' { "settings" : { "number_of_shards" : 1 }, "mappings" : { "properties" : { "field1" : { "type" : "text" } } } } '
複製代碼

Mapping主要用於幫助Elasticsearch理解每一個域中數據的類型。7.0.0以前mapping的定義一般包括type名稱。Elasticsearch支持的數據類型比較多,其中比較核心的簡單數據類型包括:

  • 字符串: text和keyword
  • 整數 : byte, short, integer, long
  • 浮點數: float, double
  • 布爾型: boolean
  • 日期: date

其餘的類型,咱們之後會作更加詳細的介紹。

刪除索引

刪除索引使用的是DELETE請求。

curl -X DELETE "localhost:9200/jackey?pretty"
複製代碼

你能夠在路徑中指定具體索引,也可使用通配符,須要刪除多個索引時,可使用逗號分隔。若是要刪除所有索引,能夠指定索引爲_all或*(不要這麼作)。在生產環境,咱們經過在elasticsearch.yml文件中將action.destructive_requires_name配置爲true來禁止這些危險的操做。

刪除操做支持的參數有如下幾種:

  • allow_no_indices:若是設置爲true,則通配符或_all匹配不到索引時不會報錯
  • expand_wildcards:控制通配符能夠擴展到的索引類型。all:能夠擴展到全部的索引。open:只能擴展到打開的索引。closed:只能擴展到關閉的索引。none:不接受通配符表達式。默認是open
  • ignore_unavailable:若是設置爲true,不存在或關閉的索引不會在返回中。默認是false
  • timeout:指定等待返回響應的最長時間。默認是30秒
  • master_timeout:鏈接master節點響應的超時時間,默認是30秒

打開/關閉索引

前面咱們已經提到過了打開/關閉索引。被關閉的索引幾乎不能對它進行任何操做,它只是用來保留數據的。而打開或關閉索引一般須要重啓分片來使操做生效。具體的操做以下:

curl -X POST "localhost:9200/jackey/_open?pretty"
複製代碼
curl -X POST "localhost:9200/jackey/_close?pretty"
複製代碼

支持的參數有:

  • allow_no_indices
  • expand_wildcards
  • ignore_unavailable
  • wait_for_active_shards
  • timeout
  • master_timeout

這些參數在前面都有介紹。這裏就再也不贅述了。

拆分索引

隨着數據的愈來愈多,咱們可能會有拆分索引的需求,感謝ES爲咱們提供了便利。

curl -X POST "localhost:9200/twitter/_split/split-twitter-index?pretty" -H 'Content-Type: application/json' -d' { "settings": { "index.number_of_shards": 2 } } '
複製代碼

在拆分索引以前,要保證索引是隻讀狀態,而且集羣健康狀態爲green。設置只讀的方法是:

curl -X PUT "localhost:9200/my_source_index/_settings?pretty" -H 'Content-Type: application/json' -d' { "settings": { "index.blocks.write": true } } '
複製代碼

拆分索引的具體操做是:

  1. 建立一個和源索引相同的目標索引,主分片要大於源索引
  2. 創建從源索引到目標索引的硬鏈接
  3. 建立低級索引後,再對document作Hash操做。這是爲了刪除屬於不一樣分片的document
  4. 恢復目標索引,就像從新打開關閉的索引同樣

總結

關於索引的使用就先介紹到這裏。還有不少不完善的地方,之後會繼續補充。想要了解更多詳細信息的同窗能夠查看官方文檔

相關文章
相關標籤/搜索