注:此文檔僅適用于 Elasticsearch > 5.0 版本
一個(gè) Elasticsearch 集群可以包含多個(gè)索引,相應(yīng)的每個(gè)索引可以包含多個(gè)類(lèi)型。這些不同的類(lèi)型存儲(chǔ)著多個(gè) 文檔厉碟,每個(gè)文檔又有多個(gè)字段涵妥,每一個(gè)文檔都有一個(gè)唯一的_id的屬性棠赛,因此索引挺智、 類(lèi)型 、_id 這三個(gè)屬性可以定位到一個(gè)具體的文檔。
一個(gè)索引類(lèi)似于傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù)朵锣,是一個(gè)存儲(chǔ)關(guān)系型文檔的地方。但是甸私,與關(guān)系型數(shù)據(jù)庫(kù)不同诚些,Elasticsearch 一次查詢(xún)可以同時(shí)搜索多個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)。
創(chuàng)建索引
默認(rèn)情況下皇型,我們可以通過(guò)添加一個(gè)新的文檔來(lái)創(chuàng)建一個(gè)新的索引诬烹,但是此時(shí)創(chuàng)建的索引采用的是默認(rèn)的配置,新的字段通過(guò)動(dòng)態(tài)映射的方式被添加到類(lèi)型映射弃鸦。如果需要對(duì)這個(gè)建立索引的過(guò)程做更多的控制:我們想要確保這個(gè)索引有數(shù)量適中的主分片绞吁,合適的映射關(guān)系和分析器,我們需要手動(dòng)創(chuàng)建索引唬格。
如果你想禁止自動(dòng)創(chuàng)建索引家破,你可以通過(guò)在
config/elasticsearch.yml
的每個(gè)節(jié)點(diǎn)下添加下面的配置:action.auto_create_index: false
PUT /my_index
{
"settings": {
"number_of_shards" : 1,
"number_of_replicas" : 0
},
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },
...
}
}
settings
下有下面幾個(gè)重要的設(shè)置:
number_of_shards
每個(gè)索引的主分片數(shù),默認(rèn)值是 5
购岗。這個(gè)配置在索引創(chuàng)建后不能修改汰聋,因此這個(gè)數(shù)值需要仔細(xì)考慮斟酌。分片類(lèi)似于數(shù)據(jù)庫(kù)中的分庫(kù)分表喊积,在集群中烹困,同一個(gè)索引的分片會(huì)均勻的分布在集群的節(jié)點(diǎn)中。
舉個(gè)例子乾吻,如果當(dāng)前集群中有3個(gè)節(jié)點(diǎn)髓梅,設(shè)置了 number_of_shards
為3拟蜻,則3個(gè)分片就會(huì)均勻的分布在3個(gè)節(jié)點(diǎn)上,查詢(xún)時(shí)枯饿,可以并行查詢(xún)3個(gè)節(jié)點(diǎn)酝锅。但是,如果集群增加到 6 個(gè)節(jié)點(diǎn)奢方,這時(shí)由于 number_of_shards
不能修改搔扁,就不能利用到 6 個(gè)節(jié)點(diǎn)了。因此袱巨,在設(shè)計(jì)之初就要考慮好 number_of_shards
怎么設(shè)置,考慮是否留一定余地碳抄。
number_of_replicas
每個(gè)主分片的副本數(shù)(即備份)愉老,默認(rèn)值是 1
。這個(gè)配置是可以隨時(shí)修改剖效。在開(kāi)發(fā)環(huán)境下可以將這個(gè)數(shù)值設(shè)置為0嫉入,以減少磁盤(pán)空間的消耗。生產(chǎn)環(huán)境下璧尸,根據(jù)節(jié)點(diǎn)數(shù)和看情況選擇合適的值咒林,值越大,磁盤(pán)空間消耗越大爷光。
我們可以用 update-index-settings
API 動(dòng)態(tài)修改副本數(shù):
PUT /my_index/_settings
{
"number_of_replicas": 1
}
refresh_interval
在 Elasticsearch 中垫竞,當(dāng)添加一個(gè)文檔到這個(gè)文檔可以被搜索需要一個(gè)過(guò)程,這個(gè)過(guò)程叫做需要消耗很大的資源蛀序,因此不是每次添加文檔 Elasticsearch 都會(huì)執(zhí)行寫(xiě)入這個(gè)操作欢瞪。因此 Elasticsearch 會(huì)在一定的窗口期內(nèi)集中大量文檔一起進(jìn)行 ,默認(rèn)情況下這個(gè)窗口期為 1s徐裸。
這就是為什么我們說(shuō) Elasticsearch 是近實(shí)時(shí)搜索遣鼓,文檔的變化不是立即對(duì)搜索可見(jiàn)的,但會(huì)在1秒之后變?yōu)榭梢?jiàn)重贺。
但并不是每種情況都需要每秒刷新骑祟。可能你正在使用 Elasticsearch 索引大量日志文件气笙,你可能想優(yōu)化索引速度而不是近實(shí)時(shí)搜索次企,可以通過(guò)設(shè)置 refersh_interval
,降低每個(gè)索引的刷新頻率潜圃。
PUT /my_index
{
"settings": {
"refresh_interval": "30s"
}
}
translog
translog 也稱(chēng)事務(wù)日志抒巢,在每一次對(duì) Elasticsearch 進(jìn)行操作時(shí)均進(jìn)行了日志記錄。translog 主要用于保證 Elasticsearch 的可靠性秉犹。當(dāng)服務(wù)器宕機(jī)時(shí)蛉谜,Elasticsearch 可以根據(jù)事務(wù)日志進(jìn)行恢復(fù)稚晚。
將 translog 持久化到磁盤(pán)的過(guò)程,在 Elasticsearch 稱(chēng)為 flush型诚。默認(rèn)情況下是每 5 秒或者每次寫(xiě)請(qǐng)求完成之后執(zhí)行一次 flush客燕。
在每次請(qǐng)求后都執(zhí)行 flush 會(huì)帶來(lái)一些性能損失,因此對(duì)于一些大容量的偶爾丟失幾秒數(shù)據(jù)問(wèn)題也不太嚴(yán)重的集群狰贯,可以使用異步 fsync 的方式提高性能也搓。比如,寫(xiě)入的數(shù)據(jù)被緩存到內(nèi)存中涵紊,在每 5 秒執(zhí)行一次 fsync傍妒。
這個(gè)行為可以通過(guò)設(shè)置 durability
參數(shù)為 async
來(lái)啟用:
PUT /my_index/_settings
{
"index.translog.durability": "async",
"index.translog.sync_interval": "5s"
}
這個(gè)選項(xiàng)可以針對(duì)索引單獨(dú)設(shè)置,也可以動(dòng)態(tài)修改摸柄。如果你決定使用異步 translog 的話(huà)颤练,你需要保證發(fā)生宕機(jī)時(shí),丟掉 sync_interval
時(shí)間段的數(shù)據(jù)也無(wú)所謂驱负。
刪除索引
# 刪除索引
DELETE /my_index
# 你也可以這樣刪除多個(gè)索引
DELETE /index_one,index_two
DELETE /index_*
# 刪除全部索引:
DELETE /_all
DELETE /*
查詢(xún)索引信息
GET /twitter
Mappings
類(lèi)型在 Elasticsearch 中表示一類(lèi)相似的文檔嗦玖,類(lèi)似于數(shù)據(jù)庫(kù)中的表。類(lèi)型由名稱(chēng)和映射組成跃脊。
映射宇挫,就像數(shù)據(jù)庫(kù)中的 schema ,描述了文檔可能具有的字段或?qū)傩?酪术、 每個(gè)字段的數(shù)據(jù)類(lèi)型以及 Lucene 是如何索引和存儲(chǔ)這些字段的器瘪。
映射的最高一層被稱(chēng)為根對(duì)象 ,它可能包含下面幾項(xiàng):
- 一個(gè) properties 節(jié)點(diǎn)绘雁,列出了文檔中可能包含的每個(gè)字段的映射
- 各種元數(shù)據(jù)字段娱局,它們都以一個(gè)下劃線(xiàn)開(kāi)頭,例如
_type
咧七、_id
和_source
- 設(shè)置項(xiàng)衰齐,控制如何動(dòng)態(tài)處理新的字段,例如
analyzer
继阻、dynamic_date_formats
和dynamic_templates
- 其他設(shè)置耻涛,可以同時(shí)應(yīng)用在根對(duì)象和其他
object
類(lèi)型的字段上,例如enabled
瘟檩、dynamic
和include_in_all
使用 PUT 添加或更新 mappings抹缕,GET 方法獲取 mappings。
PUT my_index
{
"mappings": {
"_source": { "enabled": false },
"_all": { "enabled": false },
"my_type": {
"properties": {
"tags": { "type": "keyword" }
}
}
}
}
# 獲取指定 type 的 mapping
GET /twitter/_mapping/tweet
# 獲取所有的 mapping
GET /_mapping
元數(shù)據(jù)字段
每一個(gè)文檔都有與之關(guān)聯(lián)的元數(shù)據(jù)墨辛,例如 _type
卓研、 _id
和 _source
。在創(chuàng)建映射的時(shí)候,可以自定義這些元數(shù)據(jù)的行為奏赘。
(1)文檔標(biāo)識(shí):
文檔標(biāo)識(shí)與四個(gè)元數(shù)據(jù)字段相關(guān):
_id
:文檔的 ID 字符串
_type
:文檔的類(lèi)型
_index
:文檔的索引
_uid
:_type
和 _id
連接在一起構(gòu)造成 type#id
(2)原數(shù)據(jù)
_source
:默認(rèn)地寥闪,Elasticsearch 在 _source
字段存儲(chǔ)代表文檔體的JSON字符串。然而磨淌,存儲(chǔ) _source
字段的確要使用磁盤(pán)空間疲憋。因此可以使用下面的方法禁用 _source
字段。
PUT /my_index
{
"mappings": {
"my_type": {
"_source": { "enabled": false }
}
}
}
(3)索引
_field_names
:_field_names
字段包含了文檔中所有除 null 之外的字段名稱(chēng)梁只,主要用于 exists
查詢(xún)缚柳。使用 _field_names
會(huì)增加創(chuàng)建索引的時(shí)間,如果你不需要使用 exists
查詢(xún)搪锣,可以禁用 _field_names
秋忙。
PUT /my_index
{
"mappings": {
"_doc": {
"_field_names": { "enabled": false }
}
}
}
_all
:一個(gè)把其它字段值當(dāng)作一個(gè)大字符串來(lái)索引的特殊字段(在最新的 6.0 版本中,_all
已經(jīng)取消构舟,因此不建議使用)灰追。 如果你不再需要 _all
字段,你可以通過(guò)下面的映射來(lái)禁用:
PUT /my_index/_mapping/my_type
{
"my_type": {
"_all": { "enabled": false }
}
}
字段類(lèi)型
核心類(lèi)型
text
:字符串類(lèi)型旁壮,用于全文索引的字段监嗜,例如一篇文章或評(píng)論谐檀。
keyword
:keyword 用于結(jié)構(gòu)化查詢(xún)的字段抡谐。
long
, integer
, short
, byte
, double
, float
, half_float
, scaled_float
:數(shù)字類(lèi)型
date
:時(shí)間類(lèi)型
常用的時(shí)間類(lèi)型 format 有:epoch_millis(時(shí)間戳,精確到毫秒)桐猬、epoch_second(時(shí)間戳麦撵,精確到秒)
boolean
:布爾類(lèi)型
binary
:二進(jìn)制類(lèi)型
復(fù)雜類(lèi)型
array
:json 中的數(shù)組,里面可以包含 string
溃肪、integers
免胃、array
、objects
惫撰,如果是 array
object
羔沙,里面包含的對(duì)象或數(shù)組不會(huì)被索引。
object
:對(duì)象
nested
:array 對(duì)象厨钻,里面的包含的對(duì)象字段會(huì)被索引扼雏。
其它具體的字段類(lèi)型,可以查看官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/5.0/mapping-types.html
dynamic
當(dāng) Elasticsearch 遇到文檔中以前未遇到的字段夯膀,它用動(dòng)態(tài)映射來(lái)確定字段的數(shù)據(jù)類(lèi)型并自動(dòng)把新的字段添加到類(lèi)型映射诗充。
有時(shí)這是想要的行為有時(shí)又不希望這樣。通常沒(méi)有人知道以后會(huì)有什么新字段加到文檔诱建,但是又希望這些字段被自動(dòng)的索引蝴蜓。也許你只想忽略它們。如果Elasticsearch是作為重要的數(shù)據(jù)存儲(chǔ),可能就會(huì)期望遇到新字段就會(huì)拋出異常茎匠,這樣能及時(shí)發(fā)現(xiàn)問(wèn)題格仲。
可以用 dynamic
配置來(lái)控制這種行為 ,可接受的選項(xiàng)如下:
-
true
: 動(dòng)態(tài)添加新的字段--缺省 -
false
: 忽略新的字段 -
strict
: 如果遇到新字段拋出異常
例如下面這個(gè)例子:如果遇到新字段汽抚,對(duì)象 my_type
就會(huì)拋出異常抓狭。而內(nèi)部對(duì)象 stash
遇到新字段就會(huì)動(dòng)態(tài)創(chuàng)建新字段。
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"title": { "type": "string"},
"stash": {
"type": "object",
"dynamic": true
}
}
}
}
}
把
dynamic
設(shè)置為false
時(shí)造烁,不會(huì)改變_source
的字段內(nèi)容否过。_source
仍然包含被索引的整個(gè)文檔。只是新的字段不會(huì)被加到映射中也不可搜索惭蟋。
缺省映射
通常苗桂,一個(gè)索引中的所有類(lèi)型共享相同的字段和設(shè)置。 _default_
映射更加方便地指定通用設(shè)置告组,而不是每次創(chuàng)建新類(lèi)型時(shí)都要重復(fù)設(shè)置煤伟。 _default_
映射是新類(lèi)型的模板。在設(shè)置 _default_
映射之后創(chuàng)建的所有類(lèi)型都將應(yīng)用這些缺省的設(shè)置木缝,除非類(lèi)型在自己的映射中明確覆蓋這些設(shè)置便锨。
例如,我們可以使用 _default_
映射為所有的類(lèi)型禁用 _all
字段我碟, 而只在 blog
類(lèi)型啟用:
PUT /my_index
{
"mappings": {
"_default_": {
"_all": { "enabled": false }
},
"blog": {
"_all": { "enabled": true }
}
}
}
更新 mapping
當(dāng)需要新增類(lèi)型或新增字段時(shí)放案,只需要重新 PUT 新的索引信息即可。但是當(dāng)我們需要添加新的分析器或?qū)σ延凶侄涡薷臅r(shí)矫俺,Elasticsearch 是不允許這樣做的吱殉,如果你那么做的話(huà),結(jié)果就是那些已經(jīng)被索引的數(shù)據(jù)就不正確厘托, 搜索也不能正常工作友雳。
這個(gè)時(shí)候就需要?jiǎng)?chuàng)建新的索引,然后數(shù)據(jù)重新導(dǎo)入铅匹。如果你的索引開(kāi)啟了 _source
字段押赊,則可以使用 reindex
功能快速進(jìn)行這個(gè)過(guò)程。
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
索引別名
索引別名就像一個(gè)快捷方式或軟連接包斑,可以指向一個(gè)或多個(gè)索引流礁,也可以給任何一個(gè)需要索引名的API來(lái)使用。別名 帶給我們極大的靈活性舰始,允許我們做下面這些:
- 在運(yùn)行的集群中可以無(wú)縫的從一個(gè)索引切換到另一個(gè)索引
- 給多個(gè)索引分組 (例如崇棠,
last_three_months
) - 給索引的一個(gè)子集創(chuàng)建
視圖
下面例子展示如何創(chuàng)建索引別名和刪除索引別名。
POST /_aliases
{
"actions": [
{ "remove": { "index": "my_index_v1", "alias": "my_index" }},
{ "add": { "index": "my_index_v2", "alias": "my_index" }}
]
}
通過(guò)下面的操作可以查看已經(jīng)創(chuàng)建的別名信息丸卷。
# 查看這個(gè)別名指向哪個(gè)索引
GET /*/_alias/my_index
# 哪些別名指向這個(gè)索引
GET /my_index_v1/_alias/*
索引模板
在日志類(lèi)應(yīng)用中枕稀,通常會(huì)根據(jù)日志的時(shí)間分配到不同的索引中。例如:2017-01-02 的日志分配到 log-20170102
的索引中。這樣做有幾個(gè)好處萎坷,(1)按照時(shí)間劃分凹联,按天查詢(xún)或統(tǒng)計(jì)的速度會(huì)比較快(2)如果2018年的日志比2017年的日志多,可以調(diào)整2018年日志的分片數(shù)哆档,以提高效率蔽挠。
在日志類(lèi)應(yīng)用中,如果每次都手動(dòng)創(chuàng)建索引會(huì)比較麻煩瓜浸,這時(shí)就可以使用索引模板功能讓 Elasticsearch 根據(jù)模板自動(dòng)創(chuàng)建索引澳淑。
下面例子創(chuàng)建了一個(gè) my_logs
的索引模板,此模板適用于所有以 logs-
開(kāi)頭的索引插佛,新創(chuàng)建的索引會(huì)被自動(dòng)添加到 last_3_months
這個(gè)別名中杠巡。多個(gè)模板同時(shí)匹配,以 order
順序倒排雇寇,order
越大氢拥,優(yōu)先級(jí)越高。
PUT /_template/my_logs
{
"template": "logs-*",
"order": 0,
"settings": {
"number_of_shards": 1
},
"mappings": {
"_default_": {
"_all": {
"enabled": false
}
}
},
"aliases": {
"last_3_months": {}
}
}
在運(yùn)行過(guò)程中锨侯,如果需要修改模板則可以運(yùn)行上面的例子嫩海,修改里面的參數(shù)。完成之后囚痴,創(chuàng)建新索引的配置項(xiàng)會(huì)跟著發(fā)生變化叁怪,已經(jīng)創(chuàng)建了的索引不會(huì)發(fā)生變化。
查看模板和刪除模板的方法如下:
# 刪除模板
DELETE /_template/template_1
# 查看所有模板
GET /_template
# 查看指定名稱(chēng)的模板
GET /_template/template_1
參考資料: