ES入门八:Mapping的详细讲解

news2024/10/6 2:22:01

什么是Mapping?**Mapping定义了索引中的文档有哪些字段及其类型、这些字段是如何存储和索引的。**每个文档都是一个字段的集合,每个字段都有自己的数据类型,例如我们定义的books索引,其中有book_id、name等字段。所以Mapping的作用有:

  • 定义索引中各个字段的名称和对应的类型
  • 定义各个字段、倒排索引的相关设置。如使用某字段使用什么分词器等
PUT books
{
  "mappings": {
    "properties": {
      "book_id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

如上示例是我们定义了一个索引的Mapping例子,可以看到book_id的类型为keyword,而name的类型为text,并且name字段指定了分词器为standard

我们本篇的内容主要分为以下几点:

  1. 什么是Dynamic Mapping
  2. Mapping支持的基本数据类型有哪些
  3. 如何快速定义Mapping
  4. Mapping常用的参数有哪些

Dynamic Mapping

除了预先定义好Mapping外,如果写入文档时索引不存在的时候会自动创建索引,或者写入的字段不存在也会自动创建这个字段,官方把这个功能称之为 Dynamic Mapping。

动态索引的好处是使得我们无需手动定义Mapping,ES帮我们根据文档的信息自动推算出各个字段的信息。但是啊,推算的东西不一定准确的,很多时候并不是我们想要的东西。所以还是尽量自定义Mapping

# 在不存在的索引中写入一个文档
PUT test_mapping/_doc/1
{
  "name": "es",
  "count": 1
}

# 使用下面指令查看其 Mapping 的结果
GET test_mapping/_mapping

# Dynamic Mapping 产生的 Mapping 结果
{
  "test_mapping" : {
    "mappings" : {
      "properties" : {
        "count" : { "type" : "long" },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Mapping支持的数据类型

Dynamic Mapping的功能可以自动推断字段的类型,这些类型都是ES支持的基本类型,这些类型主要有:
image.png

字符串

在7.x之后的版本中,字符串类型只有keyword和text两种,旧版本的string类型不再支持

  • keyword类型适合存储简短、结构化的字符串,例如产品Id、产品名称等。它适合用于聚合、过滤、精确查询

  • text类型的字段适合存储全文本数据,如短信内容,邮件内容等。text的类型数据将会被分词器进行分词,最终成为一个一个词项存储在倒排索引中

日期类型

我们知道JSON是没有热情类型的,所以其形式可以如下表示

  • 字符串包含日期格式,例如:“2015-01-01” 或者 “2015/01/01 12:10:30”。
  • 时间戳,以毫秒或者秒为单位

实际上,在底层ES都会把日期类型转换为UTC,并且作为毫秒形式的时间戳用一个long来存储

数字类型

数字类型分为byte、short、integer、long、float、double、half_float、scaled_float、unsigned_long

在需求满足的条件下,应当选择尽可能小的数据类型,除了可能会减少存储空间外,也会提高索引数据和检索数据的效率

对象和嵌套类型

我们的数据很多时候都需要用到数组和对象、嵌套类型等复杂数据类型来表示的,例如书本作者可以有多个,这个作者字段就需要保存为一个数组。

下面来介绍一下对象和数组,至于嵌套对象,后面会讲

对象

JSON中是可以嵌套对象的,保存对象类型可以用object类型,但实际上在ES中会讲原JSON文档扁平化存储的,加入作者字段是一个对象,那么可以表示为:

{
  "author": {
    "first":"zhang",
    "last":"san"
  }
}

实际在存储的时候,ES在存储的时候会转换为以下格式:

{
  "author.first": "zhang",
  "author.last": "san"
}

数组

对于数组来说,ES并没有定义关键字来表示一个字段为数组类型。默认情况下,**任何一个字段都可以包含0个或多个值,只需要这些值是相同的数据类型。**所以我们在创建数据的时候可以直接写入数组类型:

PUT books/_doc/3
{
  "author": ["Neil Matthew","Richard Stones"],
}

快速自定义Mapping

前面我们提到最好不要用Dynamic Mapping来生成Mapping,但是如果Mapping拥有的字段非常多的时候,自定义Mapping是非常痛苦的并且容易出错。那有没有办法减轻一下我们的工作量哪?

我们可以把JSON对象直接写入,利用Dynamic Mapping的特性帮我们生成一个初步可用的Mapping,然后我们修改这个 Mapping来直到满足我们的需求。

大概的步骤如下:

  1. 创建临时索引,并写入业务数据
  2. 获取这个临时索引的Mapping
  3. 根据业务场景,完善这个Mapping。如对某些字段定义的分词器等
  4. 完成后删除临时的索引,并创建符合需求的索引

我们在使用Dynamic Mapping的时候,JSON文档的字段类似会自动转换为ES的类型,下面是对照表:
image.png

Mapping的常用参数

Mapping参数可以用来控制某个字段的特性。例如这个字段是否被索引、用什么分词器、空值是否可以被搜索到等。Mapping提供的参数有很多,我们看看常见的几个:index、analyzer、dynamic、null_value、copy_to

index

当某个字段不想被索引或者查询的时候,可以用index参数来进行控制,其接受的值为true或者false。使用示例如下:

PUT index_param_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "index": false # name 字段不进行索引操作
      },
      "address": { "type": "text" }
    }
  }
}

analyzer

这个参数其实我们用过多次了,它是用来指定使用哪个分词器的
当我们进行全文本搜索的时候,会将检索的内容先进行分词,然后在进行匹配。默认情况下,检索的内容使用的分词器和与字段指定的分词器是一致的,但如果设置了search_analyzer,检索内容使用的分词器将与search_analyzer设定的一致。其使用示例如下:

PUT analyzer_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "simple", 
        "search_analyzer": "standard" 
      }
    }
  }
}

dynamic

可以在文档和对象级别对Dynamic Mapping进行控制,刚刚在Dynamic Mapping一节的内容中介绍过dynamic属性对文档级别的影响了,现在结合文档和对象级别来一个示例:

PUT dynamic_index
{
  "mappings": {
    "dynamic": "strict", # 1,文档级别,表示文档不能动态添加 top 级别的字段
    "properties": { 
      "author": { # 2,author 对象继承了文档级别的设置。    
        "properties": {
          "address": { 
            "dynamic": "true", # 3,表示 address 对象可以动态添加字段
            "properties":{}
          },
          "country": { "properties":{} }
        }
      }
    }
  }
}

  • dynamic:strict,如果写入不存在的字段,文档数据写入会失败。其中author对象没有设置dynamic属性,其将会继承top级别的dynamic设置,也就是说author必须有
  • author.address对象级别中也设置了dynamic属性为true,其效果address对象可以动态添加字段

null_value

如果需要对null值实现搜索的时候,需要设置字段的null_value参数。null_value参数默认值为null,其允许用户使用指定值替换控制,以便它可以索引和搜索

需要注意的是,**null_value只决定数据是如何索引的,不影响_source的内容,并且null_value的值的类型需要与字段的类型一致。**例如一个long字段的字段,其null_value的值不能为空字符串。使用“NULL”显示值来代替null,使用示例如下:

# 创建索引
PUT null_value_index
{
  "mappings": {
    "properties": {
      "id": { "type": "keyword" },
      "email": {
        "type": "keyword",
        "null_value": "NULL" # 使用 "NULL" 显式值
      }
    }
  }
}

# 插入数据
PUT null_value_index/_doc/1
{
  "id": "1",
  "email": null
}

# 查询空值数据
GET null_value_index/_search
{
  "query": {
    "term": { "email": "NULL" } # 使用显式值来查询空值的文档
  }
}

copy_to

copy_to参数允许用户复制多个字段的值到目标字段,这个字段可以像单个字段那样呗查询。其示例如下:

# 创建索引
PUT users
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": { "type": "text" }
    }
  }
}

# 插入数据
PUT users/_doc/1
{
  "first_name": "zhang",
  "last_name": "san"
}

# 查询
GET users/_search
{
  "query": {
    "match": {
      "full_name": {
        "query": "zhang san",
        "operator": "and"
      }
    }
  }
}

# 结果
{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "first_name" : "zhang",
          "last_name" : "san"
        }
      }
    ]
  }
}

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

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

相关文章

Linux运维工具-ywtool默认功能介绍

提示:工具下载链接在文章最后 目录 一.资源检查二.日志刷新三.工具升级四.linux运维工具ywtool介绍五.ywtool工具下载链接 一.资源检查 只要系统安装了ywtool工具,默认就会配置上"资源检查"的脚本资源检查脚本的执行时间:每天凌晨3点进行检查资源检查脚本的检查内容…

阿里云搭建私有docker仓库(学习)

搭建私有云仓库 首先登录后直接在页面搜索栏中搜索“容器镜像服务” 进入后直接选择个人版(可以免费使用) 选择镜像仓库后创建一个镜像仓库 在创建仓库之前我们先创建一个命名空间 然后可以再创建我们的仓库,可以与我们的github账号进行关联…

网络编程作业day5

将课堂上实现的模型&#xff08;IO多路复用&#xff09;重新自己实现一遍 服务器代码&#xff1a; #include<myhead.h> #define SER_IP "192.168.125.151" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv…

首尔之春在线资源最新电影1080p高清

打开下面这个链接就可以看到 首尔之春在线资源最新电影1080p高清 如果链接打不开&#xff0c;就复制下面的网址到浏览器打开 https://www.zhufaka.cn/liebiao/A09504AE3BF8BD06 用阿里云盘下载&#xff0c;下载完成之后&#xff0c;用迅雷播放 首尔之春在线资源最新电影10…

JAVA SE 2.基本语法

1.Java的基本语法 1.基本格式 // 类的修饰包括&#xff1a;public&#xff0c;abstract&#xff0c;final 修饰符 class 类名{程序代码 } 例: public class Test{public static void main(String[] args){System.out.println("hello " "world");} }语法说明…

蓝桥杯——123

123 二分等差数列求和前缀和数组 题目分析 连续一段的和我们想到了前缀和&#xff0c;但是这里的l和r的范围为1e12&#xff0c;明显不能用O(n)的时间复杂度去求前缀和。那么我们开始观察序列的特点&#xff0c;可以按照等差数列对序列进行分块。如上图&#xff0c;在求前10个…

一台服务器,最大支持的TCP连接数是多少?

一个服务端进程最大能支持多少条 TCP 连接&#xff1f; 一台服务器最大能支持多少条 TCP 连接&#xff1f; 一、原理 TCP 四元组的信息&#xff1a;源IP、源端口、目标IP、目标端口。 一个服务端进程最大能支持的 TCP 连接个数的计算公式&#xff1a;最大tcp连接数客户端的IP…

Nodejs 第四十六章(redis持久化)

redis持久化 Redis提供两种持久化方式&#xff1a; RDB&#xff08;Redis Database&#xff09;持久化&#xff1a;RDB是一种快照的形式&#xff0c;它会将内存中的数据定期保存到磁盘上。可以通过配置Redis服务器&#xff0c;设置自动触发RDB快照的条件&#xff0c;比如在指…

达梦数据库QA(一):用户赋予系统权限 Any 时报“授权者没有此授权权限”

问题描述 达梦数据库&#xff0c;给用户赋予系统权限 Any 时报“授权者没有此授权权限” 解决方案 方法 1&#xff1a;在 dm.ini 文件中修改参数 ENABLE_DDL_ANY_PRIV 为 1。 方法 2&#xff1a; 通过以下语句修改参数 ENABLE_DDL_ANY_PRIV。 sp_set_para_value(1,‘ENABLE…

matplotlib——直方图(python)

需求 假设你获取了250部电影的时长&#xff0c;希望统计出这些电影时长的分布状态等信息。 代码 from matplotlib import pyplot as plt import matplotlibmatplotlib.rc("font",family"FangSong")# 初始化数据 a[131, 98, 125, 131, 124, 139, 131, 1…

如何使用公网地址远程访问内网Nacos UI界面查看注册服务

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

day58 异常 IO流

异常 1异常处理机制 编译时错误 运行时错误 代码逻辑错误 2异常类结构图 java.lang.Throwable 所有异常的父类 只有它能剖出异常 java.lang.Error: extends Throwable 程序中的硬件严重问题不需要处理 java.lang.Exception extends Throwable 异常 指出要捕获的处理条件 3异常…

Licky‘s Escape 现已在苹果应用商店上线!

Pixelcraft 隆重推出 Aavegotchi 的首款手机游戏 —— Lickys Escape&#xff01; Lickys_Escape_Launch1_2024--1- 与 Licky 一起潜入 Gotchiverse吧&#xff01;Licky是一只憨厚但勇敢的Lickquidator&#xff0c;但它的任务出了差错。被一群卑鄙的 Gotchis 抓走后&#xff0c…

户外、春衣、养发……阿里妈妈经营指南揭秘38消费热点

在春天这个万象更新的季节&#xff0c;春天生意也在升温。 内容平台上&#xff0c;#成都醉美樱花季 #春天穿什么 互动增长率分别达到了156倍、252倍&#xff1b;#初春氛围感穿搭 #春游记 的互动增长率分别达到了77倍、24倍……“赏花”“穿搭”“居家锻炼”等和春天有关的消费…

计算机组成原理之机器:计算机系统的基本概念

计算机组成原理之机器 笔记来源&#xff1a;哈尔滨工业大学计算机组成原理&#xff08;哈工大刘宏伟&#xff09; Chapter1&#xff1a;计算机系统的基本概念 1.1 计算机系统简介 从物理构成的角度对计算机系统分层 计算机组成原理主要关注微体系结构&#xff08;Mirco-arc…

2024年3月6日 十二生肖 今日运势

小运播报&#xff1a;2024年3月6日&#xff0c;星期三&#xff0c;农历正月廿六 &#xff08;甲辰年丁卯月己巳日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;牛、猴、鸡 需要注意&#xff1a;鼠、虎、猪 喜神方位&#xff1a;东北方 财神方位&#xff1a;正…

知识图谱辅助的个性化推荐系统

知识图谱辅助的个性化推荐系统 将从下面4个方面展开&#xff1a; 推荐系统的基础知识知识图谱辅助的推荐方法介绍基于embedding的知识图谱推荐方法混合型知识图谱推荐方法 推荐系统的基础知识 1、什么是推荐系统 在当前互联网时代&#xff0c;推荐系统是所有面向用户的互联…

《剑指offer》14--剪绳子(整数拆分)[C++]

目录 题目描述 贪心算法 输出结果 题目描述 把一根绳子剪成多段&#xff0c;并且使得每段的长度乘积最大。 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释:…

Java基于SpringBoot的在线视频教育平台的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线视频教育平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线视频教育平台&#xff0c;它彻底改变了过…

Vue基础篇

Vue Vue是一套用于构建用户界面的渐进式JavaScript框架 什么是渐进式? Vue可以自底向上逐层地应用; 当构建简单应用时, 只需一个轻量小巧的核心库; 当构建复杂应用时, 可以引入各式各样的Vue插件 Vue具有以下特点: 采用组件化模式, 提高代码复用率且让代码更好维护 声明式编…