乐趣区

关于es7:Elasticsearch的Mapping使用分析es7官方文档解读

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

退出移动版