@TOC


参考ES 7版本官网文档
官网7.17文档

挑了一些我感觉重要的点总结
如有舛误,欢送斧正


mapping是什么

在ES里创立一个索引

PUT demo_index{    "mappings": {        "dynamic": false        "properties": {            "demo_id": {                "type": "text"            }        }    }}

下面的properties里定义了字段demo_id,它的类型是text。dynamic抉择了false阐明mapping不须要动静规定来匹配,这种状况下进行搜寻时和一般的关系型数据库搜寻十分相似。

mapping相似于数据库中的表构造定义,定义以下这些内容

  • 定义字段名称
  • 定义字段数据类型
  • 字段、倒排索引的相干配置

然而和比方mysql这样的数据相比还是有很多不同之处,搜寻的字段类型能够提前定义好,也能够不定义让ES来揣测,也可在搜寻的时候动静退出新字段。

GET /demo_index/_mapping查看mapping

动静mapping

如果你想应用动静mapping就将下面提到的dynamic字段设置为true或者runtime

默认动静mapping

ES容许直接插入文档,不须要提前定义类型、字段 ,当你查问的时候会主动揣测匹配显示进去。

curl -X PUT "localhost:9200/data/_doc/1?pretty" -H 'Content-Type: application/json' -d'{ "count": 5 }
应用kibana的话间接PUT data/_doc/1 ... 就行

自动检测类型和增加字段就是动静mapping,ES有默认的检测规定,咱们本人也能够定义本人的规定。

设计本人的mapping检测模板

这一块比较复杂

match_mapping_type
这个能够了解为依据字段默认检测进去的类型进行匹配

用的官网文档的案例:
能够看到当默认检测进去的字段类型为integer时,将替换为long类型;如果检测进去的类型为text或者keyword类型,将会替换为string类型。

PUT demo_index{  "mappings": {    "dynamic_templates": [      {        "integers": {          "match_mapping_type": "long",          "mapping": {            "type": "integer"          }        }      },      {        "strings": {          "match_mapping_type": "string",          "mapping": {            "type": "text",            "fields": {              "raw": {                "type":  "keyword",                "ignore_above": 256              }            }          }        }      }    ]  }}

这张图是在默认检测下,从Json解析进去的数据类型和ES里的数据的对应关系。须要留神的是dynamic字段设置为true和runtime的对应关系是略有不同的。

math/unmatch
依据字段名称去匹配字段类型
如下,如果JSON解析进去的字段匹配long_*并且不匹配*_text,并且默认检测进去的类型是long,那么将其匹配为string类型。

PUT demo-index{  "mappings": {    "dynamic_templates": [      {        "longs_as_strings": {          "match_mapping_type": "string",          "match":   "long_*",          "unmatch": "*_text",          "mapping": {            "type": "long"          }        }      }    ]  }}

除了应用简略的通配符来进行匹配之外,还能够应用正则表达式:

"match_pattern": "regex","match": "^profit_\d+$"

path_match/path_unmatch
这个是依据字段门路匹配,我了解是用于匹配多层级的对象。
这里产生的成果就是name对象去掉middle字段。

PUT demo-index{  "mappings": {    "dynamic_templates": [      {        "full_name": {          "path_match":   "name.*",          "path_unmatch": "*.middle",          "mapping": {            "type":       "text",            "copy_to":    "full_name"          }        }      }    ]  }}PUT demo-index/_doc/1{  "name": {    "first":  "John",    "middle": "Winston",    "last":   "Lennon"  }}
官网文档里的这个案例,还应用了copy_to,copy_to能够将值复制到另一个字段里,是一个很实用的性能。

运行时字段

能够在mapping下设置runtime局部,应用script脚本来管制动静字段。
脚本能够拜访整个文档,包含原始_source和mapping字段,脚本会查问所有所需字段的值。

PUT demo-index/{  "mappings": {    "runtime": {      "day_of_week": {        "type": "keyword",        "script": {          "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"        }      }    },    "properties": {      "@timestamp": {"type": "date"}    }  }}

运行时字段在搜寻时不会呈现在_source里,然而会有这个field,搜寻时能够指定这个字段将其值搜寻进去

>GET demo-index/_search{  "fields" : ["day_of_week"],  "query": {    "match": {      ...    }  }}

动静值就会显示在查问后果的hits里的每个hit的fields里

在某些状况下这个性能能够省去reindex, 比方发现mapping里某字段心愿批改它的数据类型,或者心愿某些字段能够有另外的一种模式,在mapping中不太不便批改,计划能够有进行reindex,然而也能够通过这种动静模式拿到想获取的值(读时建模)。


当设置dynamic字段为runtime时,

PUT demo-index{  "mappings": {    "dynamic": "runtime",    "properties": {      "@timestamp": {        "type": "date"      }    }  }}

检测到的新字段会主动退出到mapping的fields作为运行时字段。


也能够随时更新或删除运行时字段。要替换现有的运行时字段,在具备雷同名称的映射中增加一个新的运行时字段。设置null就能够删除。

PUT demo-index/_mapping{ "runtime": {   "day_of_week": null }}

dynamic

dynamic用于管制是否动静增加新字段,可选项有:

  • true:新字段增加到mapping中(默认)。
  • runtime:新字段作为运行时字段增加到mapping中,这些字段不可索引,是_source在查问时加载的。
  • false:疏忽新字段,这些字段不会被索引或搜寻,但仍会呈现在_source返回的命令和字段中。这些字段不会增加到mapping中,必须显式增加新字段。
  • strict:如果检测到新字段,则会抛出异样。必须将新字段显式增加到mapping中。

动静模式 (true)艰深来说就是往index里写入doc,doc里的字段类型对应es里的什么数据类型,将会由默认揣测规定来进行主动揣测匹配(当然也能够自义定揣测规定)。

不须要动静模式(false)的时候,能够依照本人的理论需要去设置mapping,插入doc的时候,字段与mapping里的保持一致,如果doc增加了一个mapping里不存在的字段,新字段不会被主动增加到mapping中,并且指定该字段进行查问时,也无奈匹配到后果,能够存储、然而不能索引。

当dynamic设置为false时,显式设置mapping,相似于关系型数据库