Elasticsearch Index Templates(索引模板)

索引模板,故名思議,就是建立索引的模板,模板中包含公共的配置(settings)和映射(Mapping),幷包含一個簡單觸發條件,及條件知足時使用該模板建立一個新的索引。json

注意:模板只在建立索引時應用。更改模板不會對現有索引產生影響。當使用create index API時,做爲create index調用的一部分定義的設置/映射將優先於模板中定義的任何匹配設置/映射。微信

一個索引模板示例以下:app

1PUT _template/template_1
 2{
 3  "index_patterns": [「ubi*」],                //@1
 4  "settings": {                                               //@2 
 5    "number_of_shards": 1
 6  },
 7  "mappings": {                                             //@3
 8    "_doc": {
 9      "_source": {
10        "enabled": false
11      },
12      "properties": {
13        "host_name": {
14          "type": "keyword"
15        },
16        "created_at": {
17          "type": "date",
18          "format": ""
19        }
20      }
21    }
22  }
23}

代碼@1:觸發條件。運維

代碼@2:索引配置定義。ide

代碼@3:索引映射配置。ui

上述示例對應的JAVA示例以下:3d

1public static final void createIndexTemp() {
 2        RestHighLevelClient client = EsClient.getClient();
 3        try {
 4            PutIndexTemplateRequest request = new PutIndexTemplateRequest("ubi_index_template")
 5            List<String> indexPatterns = new ArrayList<String>();
 6            indexPatterns.add("ubi*");
 7            request.patterns(indexPatterns);
 8
 9            /** mapping */
10            XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()
11                    .startObject()
12                        .startObject("_source")
13                            .field("enabled", false)
14                        .endObject()
15
16                        .startObject("properties")
17                            .startObject("host_name")
18                                .field("type", "keyword")
19                            .endObject()
20                            .startObject("created_at")
21                                .field("type", "date")
22                                .field("format", "yyyy-MM-dd HH:mm:ss")
23                            .endObject()
24
25                        .endObject()
26                    .endObject();
27
28
29            request.mapping("_doc", jsonBuilder);
30
31            Map<String, Object> settings = new HashMap<>();
32
33            settings.put("number_of_shards", 1);
34            request.settings(settings);
35
36            System.out.println(client.indices().putTemplate(request, RequestOptions.DEFAULT));
37
38        } catch (Exception e) {
39            // TODO: handle exception
40        } finally {
41            EsClient.close(client);
42        }
43    }

上述索引模板建立好以後,而後在向一個不存在的索引添加文檔時,若是能找到合適的模板,則自動建立索引,不然拋出索引不存在,例如:code

1public static void index_template() {
 2        ElasticsearchTemplate template = new ElasticsearchTemplate();
 3        try {
 4            Map<String, String> data = new HashMap<>();
 5            data.put("host_name", "localhost");
 6            data.put("created_at", "2019-04-07 23:05:04");
 7            //ubi_201904該索引一開始不存在,但索引ubi_201904符合ubi_index_template
 8            //中定義的匹配表達式ubi*,因此會自動建立索引。
 9            template.index("ubi_201904", "_doc", data);
10        } finally {
11            template.close();
12        }
13    }

其返回結果:orm

1IndexResponse[index=ubi_201904,type=_doc,id=lCJZ-GkBrOLJP-QWff3I,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]

那若是能匹配到多個模板呢?blog

多個索引模板可能匹配一個索引,可使用order屬性爲索引模板指定順序。從順序較小的開始尋找,order越大,越優先(前提是匹配模板表達式)。

舉例以下:

1PUT /_template/template_1
 2{
 3    "index_patterns" : ["*"],
 4    "order" : 0,
 5    "settings" : {
 6        "number_of_shards" : 1
 7    },
 8    "mappings" : {
 9        "_doc" : {
10            "_source" : { "enabled" : false }
11        }
12    }
13}
14
15PUT /_template/template_2
16{
17    "index_patterns" : ["te*"],
18    "order" : 1,
19    "settings" : {
20        "number_of_shards" : 1
21    },
22    "mappings" : {
23        "_doc" : {
24            "_source" : { "enabled" : true }
25        }
26    }
27}

首先從order=0進行匹配,因爲其表達式爲*,則默認會全匹配,故首先嚐試使用該模板,而後再遍歷下一個模板,也就是order=1的模板,若是匹配,則使用第二個模板的配置,若是不匹配,則使用第一個模板的配置,依次類推。

其匹配的具體實現邏輯大概以下:
一、對全部的模板按照order屬性進行升序排序。
二、遍歷全部的模板,進行表達式匹配,匹配成功,則設置爲當前匹配模板,而後判斷下一個,直到把全部的模板都處理過。
三、選最後匹配的模板當成最後的模板。

那若是存在多個模板,其order相同,那其順序能保證嗎?

答案是不能保證,由於對全部模板進行排序的過程當中,若是order相同,其順序沒法獲得保證。

思考:索引模板的使用場景是什麼呢?歡迎你們留言討論。

更多文章請關注微信公衆號:

Elasticsearch Index Templates(索引模板)
做者新書《RocketMQ技術內幕》已成功上市。
Elasticsearch Index Templates(索引模板)

《RocketMQ技術內幕》已出版上市,目前可在主流購物平臺(京東、天貓等)購買,本書從源碼角度深度分析了RocketMQ NameServer、消息發送、消息存儲、消息消費、消息過濾、主從同步HA、事務消息;在實戰篇重點介紹了RocketMQ運維管理界面與當前支持的39個運維命令;並在附錄部分羅列了RocketMQ幾乎全部的配置參數。本書獲得了RocketMQ創始人、阿里巴巴Messaging開源技術負責人、Linux OpenMessaging 主席的高度承認並做序推薦。目前是國內第一本成體系剖析RocketMQ的書籍。

相關文章
相關標籤/搜索