集群上的索引会随着时间越来越多,例如,会为你的日志每天创建一个索引。
使用多个素银可以更好的管理数据,提高性能,例如:logs-2019-05-01、logs-2019-05-02。

1. Index Template

1.1 什么是Index Template?

  • Index Template:帮助你设定 Mapping 和 Settings,并按照一定的规则自动匹配到新创建的索引上
    • Mappings 主要作用于字段的信息说明;
    • Settings 主要作用于 index 的一些相关配置信息,如分片数、副本数,tranlog 同步条件、refresh 等;
    • 模板尽在一个索引被新创建时,才会产生作用。修改模板不会影响已创建的索引;
    • 你可以设定多个索引模板,这些设置会被 “merge” 在一起;
    • 你可以指定 “order” 的数值,控制 “merging” 的过程;

1.2 Index Template的工作方式

  • 当一个索引被新创建时
    • 使用 Elasticsearch 默认的 settings 和 mappings
    • 使用 order 数值低的 Index Template 中的设定
    • 使用 order 数值高的 Index Template 中的设定,之前的设定会被覆盖
    • 创建索引时,用户如果自己配置 settings 和 mappings,并覆盖之前模板中的设定

:::info 只要索引名字满足模板中的正则表达式,就会在索引创建时自动触发索引模板。 :::

  1. #插入数据
  2. PUT ttemplate/_doc/1
  3. {
  4. "someNumber":"1",
  5. "someDate":"2019/01/01"
  6. }
  7. #查看Dynamic Mapping,数字字符串被映射成text,日期字符串被映射成日期
  8. GET ttemplate/_mapping
  9. #创建2Index Template
  10. #创建一个默认的 default template
  11. PUT _template/template_default
  12. {
  13. "index_patterns": ["*"],
  14. "order" : 0,
  15. "version": 1,
  16. "settings": {
  17. "number_of_shards": 1,
  18. "number_of_replicas":1
  19. }
  20. }
  21. #创建template_test模板
  22. PUT /_template/template_test
  23. {
  24. "index_patterns" : ["test*"],
  25. "order" : 1,
  26. "settings" : {
  27. "number_of_shards": 1,
  28. "number_of_replicas" : 2
  29. },
  30. "mappings" : {
  31. "date_detection": false,
  32. "numeric_detection": true
  33. }
  34. }
  35. #查看template信息
  36. GET /_template/template_default
  37. GET /_template/temp*
  38. #写入新的数据,indextest开头
  39. PUT testtemplate/_doc/1
  40. {
  41. "someNumber":"1",
  42. "someDate":"2019/01/01"
  43. }
  44. #数字转成long,日期字符串转成text
  45. GET testtemplate/_mapping
  46. #primary1, replica: 2
  47. GET testtemplate/_settings
  48. #创建一个临时索引test*开头,会触发template_test模板
  49. PUT testmy
  50. {
  51. "settings":{
  52. "number_of_replicas":5
  53. }
  54. }
  55. PUT testmy/_doc/1
  56. {
  57. "key":"value"
  58. }
  59. #查看replica: 5
  60. GET testmy/_settings
  61. #清理
  62. DELETE testmy
  63. DELETE /_template/template_default
  64. DELETE /_template/template_test

2. Dynamic Template

2.1 什么是 Dynamic Template?

  • 根据 ES 识别的数据类型,结合字段名称,来动态设定字段类型,例如:
    • 所有的字符串类型都设定成 keyword,或者关闭 keyword 字段
    • is 开头的字段都设置成 boolean
    • long_ 开头的都设置成 long 类型

2.2 Dynamic Template设定

  • Dynamic Template 是定义在某个索引的 Mapping 中;
  • Template 有一个名称;
  • 匹配规则是一个数组,参数如下:
    • match_mapping_type:自动识别文档中的字段值在对应匹配到 ES 中的类型,如 string、boolean 等;
    • match,unmatch:寻找匹配文档有没有对应匹配的字段名;
    • path_match,patch_unmatch:结合路径去匹配字段名
  • 为匹配到字段设置 Mapping;

:::info

  • 注意 template 数组中的顺序:
    • 模板按照顺序来检测,第一个匹配的模板会被优先启用;
    • 例如,我们给 string 类型字段定义两个模板:
      • strings_as_boolean:以 is 开头的字段名会映射成 boolean;
      • strings_as_keywords:所有其他 text 字段映射成 keyword;
    • 我们将 string_as_boolean 模板放在第一位,因为它比匹配所有字符串字段的 strings_as_keyword 模板更特殊。 ::: ```json DELETE my_index

Dynaminc Mapping 根据类型和字段名

PUT my_index/_doc/1 { “firstName”:”Ruan”, “isVIP”:”true” }

查看Dynaminc Mapping,对应的都是text类型

GET my_index/_mapping

DELETE my_index

为索引创建mapping,在mapping中创建dynamic template

给每一种匹配映射创建一个dynamic template,并取一个名字

PUT my_index { “mappings”: { “dynamic_templates”: [ { “strings_as_boolean”: { “match_mapping_type”: “string”, “match”:”is*”, “mapping”: { “type”: “boolean” } } }, { “strings_as_keywords”: { “match_mapping_type”: “string”, “mapping”: { “type”: “keyword” } } } ] } }

DELETE my_index

结合路径

匹配name路径下的除了middle的所有字段,将其类型配置为text,且内容copy到full_name

PUT my_index { “mappings”: { “dynamic_templates”: [ { “full_name”: { “path_match”: “name.“, “path_unmatch”: “.middle”, “mapping”: { “type”: “text”, “copy_to”: “full_name” } } } ] } }

PUT my_index/_doc/1 { “name”: { “first”: “John”, “middle”: “Winston”, “last”: “Lennon” } }

GET my_index/_search?q=full_name:John ```