@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,相似于关系型数据库