前文我們提到,Elasticsearch的數(shù)據(jù)都存儲在索引中,也就是說蕾羊,索引相當(dāng)于是MySQL中的數(shù)據(jù)庫。是最基礎(chǔ)的概念帽驯。今天分享的也是關(guān)于索引的一些常用的操作肚豺。
創(chuàng)建索引
curl -X PUT "localhost:9200/jackey?pretty"
ES創(chuàng)建索引使用PUT請求即可,上面是最簡單的新建一個索引的方法界拦,除此之外吸申,你還可以指定:
- Settings
- Mappings
- aliases
索引名稱有以下限制:
- 必須是小寫
- 不能包含:
\
,/
,*
,?
,"
,<
,>
,|
,(空格),
,
,#
- 在ES7.0以前索引名可以包含冒號,但是7.0之后不支持了
- 不能以
-
,_
和+
開頭 - 不能是
.
或..
- 長度不能超過255字節(jié)
請求支持的一些參數(shù)有:
- wait_for_active_shards:繼續(xù)操作前,必須處于active狀態(tài)的分片數(shù)截碴,默認(rèn)是1梳侨,也可以設(shè)置為all或者不大于總分片數(shù)的任意正整數(shù)
- timeout:設(shè)置等待響應(yīng)的超時時間,默認(rèn)是30秒
- master_timeout:連接master節(jié)點響應(yīng)的超時時間日丹,默認(rèn)是30秒
前面我們提到創(chuàng)建索引時可以指定三種屬性走哺,這三種屬性都需要放在body中。
aliases
索引的別名哲虾,一個別名可以賦給多個索引丙躏。
給一個index起別名的方式有兩種,一種是創(chuàng)建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岸梨,這個屬性默認(rèn)是false,如果設(shè)置成true稠氮,表示可以通過這個別名來寫索引,默認(rèn)情況下半开,別名像一個軟鏈接隔披,是不可以修改原索引的。
此外寂拆,還可以使用通配符為多個索引增加相同的別名
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分為靜態(tài)和動態(tài)兩種。靜態(tài)的只能在索引創(chuàng)建或關(guān)閉時設(shè)置纠永;動態(tài)的則可以使用update-index-settings API來實時設(shè)置鬓长。上面的例子中,number_of_shards屬于靜態(tài)設(shè)置尝江,number_of_replicas屬于動態(tài)設(shè)置涉波。
索引可以設(shè)置的setting可以在官方文檔的Index modules查看,下面我會挑幾個我認(rèn)為比較重要的介紹一下。
先從靜態(tài)開始:
- index.number_of_shards:指定索引的分片數(shù)啤覆,只能在創(chuàng)建索引時設(shè)置苍日。默認(rèn)是1,最大可以設(shè)置為1024窗声。這是出于安全考慮的一種保護措施相恃。最大值可以通過設(shè)置系統(tǒng)變量來控制export ES_JAVA_OPTS="-Des.index.max_number_of_shards=128"
- index.routing_partition_size:可以路由的分片數(shù)量,同樣只能在創(chuàng)建索引時指定笨觅,默認(rèn)值為1.這個值必須小于number_of_shards(除非number_of_shards的值也是1)
動態(tài)setting:
- index.number_of_replicas:每個分片的副本數(shù)拦耐,默認(rèn)是1
- index.auto_expand_replicas:基于數(shù)據(jù)節(jié)點可以自動擴展的副本數(shù),默認(rèn)為為false见剩∩迸矗可以設(shè)置為一個區(qū)間,以短線分隔炮温,例如「0-5」火脉,也可以設(shè)置成all。需要注意的是柒啤,副本的自動擴展并不會考慮其他的分配規(guī)則倦挂。這有可能導(dǎo)致集群狀態(tài)變成黃色
- index.search.idle.after:分片被認(rèn)為搜索空閑之前沒有收到請求或搜索的時間。默認(rèn)30秒担巩。
- index.refresh_interval:刷新操作的執(zhí)行頻率方援,默認(rèn)是1s。如果設(shè)置成-1涛癌,表示不會刷新犯戏。如果沒有顯式設(shè)置,分片在收到搜索請求前至少index.search.idle.after秒內(nèi)不會后臺刷新
- index.max_result_window:返回結(jié)果的最大數(shù)量拳话,默認(rèn)是10000(一萬)先匪。搜索返回結(jié)果占用的內(nèi)存和時間受到這個值的限制
- index.routing.rebalance.enable:是否允許分片的自平衡。默認(rèn)是all弃衍,允許所有分片重新平衡呀非。還可以設(shè)置為primaries,只允許主分片重新平衡镜盯。replicas只允許從分片重新平衡岸裙。none不允許分片重新平衡。
除了以上靜態(tài)setting和動態(tài)setting之外速缆,setting中還可以設(shè)置一些其他的值降允,例如分詞器等,這些我們以后再做更詳細的介紹艺糜。
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理解每個域中數(shù)據(jù)的類型剧董。7.0.0之前mapping的定義通常包括type名稱幢尚。Elasticsearch支持的數(shù)據(jù)類型比較多,其中比較核心的簡單數(shù)據(jù)類型包括:
- 字符串: text和keyword
- 整數(shù) : byte, short, integer, long
- 浮點數(shù): float, double
- 布爾型: boolean
- 日期: date
其他的類型送滞,我們以后會做更加詳細的介紹侠草。
刪除索引
刪除索引使用的是DELETE請求。
curl -X DELETE "localhost:9200/jackey?pretty"
你可以在路徑中指定具體索引犁嗅,也可以使用通配符边涕,需要刪除多個索引時,可以使用逗號分隔褂微。如果要刪除全部索引功蜓,可以指定索引為_all或*(不要這么做)。在生產(chǎn)環(huán)境宠蚂,我們通過在elasticsearch.yml文件中將action.destructive_requires_name配置為true來禁止這些危險的操作式撼。
刪除操作支持的參數(shù)有以下幾種:
- allow_no_indices:如果設(shè)置為true,則通配符或_all匹配不到索引時不會報錯
- expand_wildcards:控制通配符可以擴展到的索引類型求厕。all:可以擴展到所有的索引著隆。open:只能擴展到打開的索引。closed:只能擴展到關(guān)閉的索引呀癣。none:不接受通配符表達式美浦。默認(rèn)是open
- ignore_unavailable:如果設(shè)置為true,不存在或關(guān)閉的索引不會在返回中项栏。默認(rèn)是false
- timeout:指定等待返回響應(yīng)的最長時間浦辨。默認(rèn)是30秒
- master_timeout:連接master節(jié)點響應(yīng)的超時時間,默認(rèn)是30秒
打開/關(guān)閉索引
前面我們已經(jīng)提到過了打開/關(guān)閉索引沼沈。被關(guān)閉的索引幾乎不能對它進行任何操作流酬,它只是用來保留數(shù)據(jù)的。而打開或關(guān)閉索引通常需要重啟分片來使操作生效列另。具體的操作如下:
curl -X POST "localhost:9200/jackey/_open?pretty"
curl -X POST "localhost:9200/jackey/_close?pretty"
支持的參數(shù)有:
- allow_no_indices
- expand_wildcards
- ignore_unavailable
- wait_for_active_shards
- timeout
- master_timeout
這些參數(shù)在前面都有介紹芽腾。這里就不再贅述了。
拆分索引
隨著數(shù)據(jù)的越來越多页衙,我們可能會有拆分索引的需求摊滔,感謝ES為我們提供了便利。
curl -X POST "localhost:9200/twitter/_split/split-twitter-index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.number_of_shards": 2
}
}
'
在拆分索引之前拷姿,要保證索引是只讀狀態(tài),并且集群健康狀態(tài)為green旱函。設(shè)置只讀的方法是:
curl -X PUT "localhost:9200/my_source_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.blocks.write": true
}
}
'
拆分索引的具體操作是:
- 創(chuàng)建一個和源索引相同的目標(biāo)索引响巢,主分片要大于源索引
- 建立從源索引到目標(biāo)索引的硬連接
- 創(chuàng)建低級索引后,再對document做Hash操作棒妨。這是為了刪除屬于不同分片的document
- 恢復(fù)目標(biāo)索引踪古,就像重新打開關(guān)閉的索引一樣
總結(jié)
關(guān)于索引的使用就先介紹到這里含长。還有很多不完善的地方,以后會繼續(xù)補充伏穆。想要了解更多詳細信息的同學(xué)可以查看官方文檔拘泞。