1. 程式人生 > 程式設計 >Elasticsearch從入門到放棄:索引基本使用方法

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

前文我們提到,Elasticsearch的資料都儲存在索引中,也就是說,索引相當於是MySQL中的資料庫。是最基礎的概念。今天分享的也是關於索引的一些常用的操作。

建立索引

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

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

  • Settings
  • Mappings
  • aliases

索引名稱有以下限制:

  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中。

aliases

索引的別名,一個別名可以賦給多個索引。

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

方式一:

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

方式二:

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,表示可以通過這個別名來寫索引,預設情況下,別名像一個軟連結,是不可以修改原索引的。

此外,還可以使用萬用字元為多個索引增加相同的別名

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. 恢復目標索引,就像重新開啟關閉的索引一樣

總結

關於索引的使用就先介紹到這裡。還有很多不完善的地方,以後會繼續補充。想要了解更多詳細資訊的同學可以檢視官方檔案