前文我們提到,Elasticsearch的數據都存儲在索引中,也就是說,索引相當於是MySQL中的數據庫。是最基礎的概念。今天分享的也是關於索引的一些常用的操作。
創建索引
curl -X PUT "localhost:9200/jackey?pretty"
ES創建索引使用PUT請求即可,上面是最簡單的新建一個索引的方法,除此之外,你還可以指定:
- Settings
- Mappings
- aliases
索引名稱有以下限制:
- 必須是小寫
- 不能包含:
\
,/
,*
,?
,"
,<
,>
,|
,(空格),
,
,#
- 在ES7.0以前索引名可以包含冒號,但是7.0之後不支持了
- 不能以
-
,_
和+
開頭 - 不能是
.
或..
- 長度不能超過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
}
}
'
拆分索引的具體操作是:
- 創建一個和源索引相同的目標索引,主分片要大於源索引
- 建立從源索引到目標索引的硬連接
- 創建低級索引後,再對document做Hash操作。這是爲了刪除屬於不同分片的document
- 恢復目標索引,就像重新打開關閉的索引一樣
總結
關於索引的使用就先介紹到這裏。還有很多不完善的地方,以後會繼續補充。想要了解更多詳細信息的同學可以查看官方文檔。