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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理