Elasticsearch的Mapping使用分析(es7官方文档解读)

news2024/11/15 19:30:33

目录

  • mapping是什么
  • 动态mapping
    • 默认动态mapping
    • 设计自己的mapping检测模板
  • 运行时字段
  • dynamic


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三十二、Kubernetes中Service详解、实例第二篇

1、概述 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题,kubernetes提供了Service资源&…

HTML常见转义字符

HTML中常见的转义字符 其他一些常用的字符实体: 链接 http://www.w3chtml.com/html/character.html

PID优化系列之给定值斜坡函数(PLC完整代码+Simulink仿真测试)

很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1 低通滤波器对给定值进行平滑。给定值缓慢变化在很多闭环控制系统里很重要,比如收放卷在初始建张阶段目标值不建议突变容易将卷材拉断(…

初识 Django(Python WEB 框架)

初识 Django(Python WEB 框架)参考描述优劣 Django(部分)优势功能完备,开箱即用开发效率高Admin 管理后台安全ORM可扩展劣势性能模板过渡封装获取长期支持版(Long Time Support,LTS)…

基于Java+SpringBoot+Vue企业资源规划系统设计与实现

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…

开源项目介绍

文章目录简介经验casdoorkeycloaklatexopenMP简介 不经常见的开源项目,第一次接触。 经验 如果是已经开源的软件,使用起来非常的平稳,问题也少。原因是已经经过了多年的历练,已经稳当下来,该发现的问题已经解决的差…

unplugin-vue-components 不能识别组件的自动导入的类型 (pnpm)

引言 unplugin-vue-components 是一款能帮助组件自动导入的库&#xff0c;简单点的说&#xff0c;你不需要使用import xx from xxx.vue 这行语句也能实现导入的效果。 <script setup lang"ts"> import ScreenAdpter from compontents/ScreenAdpter/index.vue i…

[前端笔记——多媒体与嵌入] 6.HTML 中的图片+视频+音频内容

[前端笔记——HTML介绍] 6.HTML 中的图片1.HTML中的图片1.1怎样将一幅图片放到网页上&#xff1f;1.2备选文本1.3宽度和高度1.4.Image titles 图片标题1.5通过为图片搭配说明文字的方式来解说图片1.6CSS背景图片2.视频和音频内容2.1Web中的视频和音频2.1.1<video>元素2.1…

在linux中部署SpringBoot+Vue前后端分离应用

最近有任务需求&#xff0c;自己在linux中通过docker虚拟环境的方式部署了SpringBoot和Vue前后端分离的项目&#xff0c;现在做点总结&#xff0c;给需要的小伙伴分享。不足之处多多指正。关于在linux中安装docker&#xff0c;可以查看博主前几篇博客按照步骤进行安装&#xff…

【JUC系列】ReentrantLock实现本地锁的源码分析

使用场景 public class ReentrantLockTest {private static ReentrantLock lock new ReentrantLock();public static void main(String[] args) {new Thread(()->{lock.lock();// do somethingSystem.out.println("111");try {Thread.sleep(Integer.MAX_VALUE);…

[ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择

前几天看到一个问答帖&#xff0c;我回答完了才发现这个帖子居然是去年的也没人回复&#xff0c;其中他问了一些华为云的问题&#xff0c;对于其中的一些概念&#xff0c;这里来总结讲解一下&#xff0c;希望对学习华为云的小伙伴有所帮助。 文章目录区域&#xff08;Region&am…

致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划

岁末年初&#xff0c;在开源领域刚埋下一颗生机勃勃的种子的 Tapdata&#xff0c;想和正在关注我们的开发者&#xff0c;聊聊这一年的进展和新一年的共建计划。 2022年4月&#xff0c;Tapdata 宣布开源 PDK&#xff08;Plugin Development Kit&#xff09;&#xff0c;将自身的…

前端js实现文件多次添加累加上传和选择删除(django+js)- 添加累加文件上传 (一)

前言 原本的多文件上传功能在选择文件时&#xff0c;只能通过同一范围的鼠标框选或者ctrl/shift多选取选择文件&#xff0c;这样选择文件很不灵活&#xff0c;而且在确定之后如果漏选了文件&#xff0c;再次点击上传按钮时会清空表单里的文件信息&#xff0c;只能重复之前的操…

数据库mysql调优

问题描述: mysql dba在mysql服务端启用了连接在空闲一定时间 (10分钟) 后&#xff0c;就自动关闭连接(连接失效)的功能&#xff0c;导致java端连接池在空闲一段时间后&#xff0c;连接被自动关闭(自动失效)。为了避免这种情况出现&#xff0c;可以在dbcp上配置空闲的时候检测连…

PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2、Add-in Card 它们有啥区别?这些概念你搞清楚了吗?

搞硬件或通信的“攻城狮”们&#xff0c;免不了要和各种通信协议及接口打交道。比如&#xff0c;我们经常接触PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2(NGFF)、Add-in Card这些概念&#xff0c;作为“攻城狮”队伍中的一员&#xff0c;你搞清楚它们之间的关系了吗&…

Python爬虫教你爬取csdn作者排行榜

(一)两种爬取方式介绍 1.自动化测试工具 安装好驱动(以前的selenium文章有教程),然后进行元素定位&#xff0c;最后数据提取&#xff0c;用xls表格进行持久化存储 2.requests库 利用基本方法发起请求&#xff0c;获得json数据进行持久化存储 本篇文章先讲解第二种&#xf…

洛谷——树与图dp与状压dp

文章目录[NOIP1996 提高组] 挖地雷题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码最大食物链计数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码[ZJOI2006]三色二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #…

浅说 INSERT/块参照/BlockReference

在AutoCAD中使用INSERT命令插入一个块时&#xff0c;生成块参照实体&#xff0c;也叫INSERT实体&#xff0c;在ObjectARX中&#xff0c;对应类AcDbBlockReference。反正就这么一个东西&#xff0c;名儿还挺多&#xff0c;我家乡有句话叫“二嫚她婆婆俩名”&#xff0c;莫非这是…

数据结构(5) treap

活动 - AcWing 参考—《算法竞赛进阶指南》-lyd 目录 一、概述 二、具体操作详解 1.常见操作 2.结构定义 3.操作基础函数 &#xff08;1&#xff09;pushup &#xff08;2&#xff09; 获得一个新节点 &#xff08;3&#xff09;左旋右旋 &#xff08;4&#xff09;建…

centos上面用docker 安装nacos 1.4.1

方式一&#xff1a; 下载nacos本地文件 1. 去官网下载GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.2.上传到Linux服务器中cd /usr/uploadtar -zxvf nacos-serv…