ES5_2创建Index原则

定义索引的最佳实践。

创建Index模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
PUT /index_name_v1 {
"aliases": {
"index_name" {}
},
"settings": {
// 在这里定义索引的通用属性
"index": {
"refresh_interval": "10s",
"number_of_shards" : "12",
"number_of_replicas" : "1",
"search.slowlog.threshold.query.warn": "5s",
"search.slowlog.threshold.query.info": "1s",
"search.slowlog.threshold.fetch.warn": "1s",
"search.slowlog.threshold.fetch.info": "800ms",
"indexing.slowlog.threshold.index.warn": "12s",
"indexing.slowlog.threshold.index.info": "5s"
},
// 在这里定义分析器,可以根据需要指定分词器、过滤器等
"analysis": {
"analyzer": {
"analyzer_name": {
"char_filter": { ... custom character filters ... },
"tokenizer": { ... custom tokenizers ... },
"filter": { ... custom token filters ... }
}
}
}
},
"mappings": {
"my_type_name": {
"properties": {
"xxx_id": {
"type": "keyword"
},
"timestamp" : {
"type": "long"
},
"@timestamp" : {
"type": "date"
},
"xxx_status": {
"type": "integer"
},
"xxx_content": {
"type": "text",
"analyzer": "analyzer_name"
}
}
}
}
}

索引名

可以看到索引名设置了别名,主要是为了方便后续因为主分片数调整或者调整某字段类型等原因需要reindex。
若没有加后缀且指定好别名,则reindex时需要业务线停止写入的,且需要修改业务代码写入到新的索引。

索引设置

  • refresh_interval
    刷新数据间隔,可以让刚刚写入的数据被查到。
    如果写入数据量较大或业务对查询实时性要求不高,则可以将该时间设置得稍微大一些。
    比如,若一天的写入能超过100G的数据量,则建议至少设置为10s,500G设置为60s,1T以上设置为120s。当然还得考虑硬件情况。
  • number_of_shards、number_of_replicas
    主分片和副分片数
    推荐主分片设置为12,副分片设置为1。
  • 慢日志设置
    不要设置过小,可能会将磁盘打满、影响数据存储。

mapping

  • type名称
    一般一个index一个type,如果多个type会由于文档字段稀疏导致浪费存储空间。
  • 枚举
    可以定义为integer
  • content
    指需要支持搜索的字段,需要设置为text类型,且可以设置分词器
  • 聚合类字段
    如果需要聚合查询,最好设置成keyword。

    keyword支持聚合不支持分词,text反过来。

参考

  1. elasticsearch 分片选择