ES入门八:Mapping的详细讲解

什么是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.mzph.cn/news/722115.shtml

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

相关文章

96道前端面试题,前端开发工作内容

HTML、CSS、JS三大部分都起什么作用? HTML内容层,它的作用是表示一个HTML标签在页面里是个什么角色;CSS样式层,它的作用是表示一块内容以什么样的样式(字体、大小、颜色、宽高等)显示;JS行为层…

OJ_子串计算

题干 c实现 #include <stdio.h> #include <string> #include <map>using namespace std;int main() {char strArr[100];while (scanf("%s", strArr) ! EOF) {string str strArr;map<string, int> subCount;for (int i 0; i < str.size…

android开发简历源码,今年Android面试必问的这些技术面

1、拓宽知识面 兴趣来了挡也挡不住&#xff01;从最初开始学习编程&#xff0c;从ASP到ASP.net,JS,Winform,Java,C,PHP,Python,都是自学&#xff01; 不过这里要说一下&#xff0c;如果没有一两门编程语言比较熟悉的情况下&#xff0c;最好还是不要自学&#xff1b;入门是最难…

Preferences为何优先选择Datastore,尽管它速度慢一些...

Preferences为何优先选择Datastore,尽管它速度慢一些… Preferences Datastore 在性能上虽然较慢,但相对于 Shared Preferences,仍应该优先选择它。以下是原因分析: 几年前,Android 引入了一个名为 Preferences Datastore 的新存储库,旨在取代 Shared Preferences 成为默…

Python学习 day07(JSON、format()函数)

JSON 各种编程语言存储数据的容器不尽相同&#xff0c;在Python中有字典dict这样的数据类型&#xff0c;而其他语言可能没有对应的字典&#xff0c;为了让不同的语言都能够相互通用的传递数据&#xff0c;JSON就是一种非常良好的中转数据格式&#xff0c;如下&#xff1a; JSON…

七大 排序算法(一篇文章梳理)

一、引言 排序算法是计算机科学中不可或缺的一部分&#xff0c;它们在数据处理、数据库管理、搜索引擎、数据分析等多个领域都有广泛的应用。排序算法的主要任务是将一组数据元素按照某种特定的顺序&#xff08;如升序或降序&#xff09;进行排列。本文将对一些常见的排序算法…

【OpenGL】(1) 专栏介绍:OpenGL 库 | 3D 计算机图形应用 | GPGPU 计算 | 3D 建模和 3D动画 | 渲染技术介绍

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; &#x1f4ad; 写在前面&#xff1a;本专栏主要内容是关于 3D 计算机图形技术的学习&#xff0c;重点是学习与此技术相关的 3D 实时渲染 (3D real-time rendering) 技术。我们会以…

Vue3:用vite创建Vue3项目

一、简介 vite是新一代前端构建工具&#xff0c;官网地址&#xff1a;https://vitejs.cn vite的优势如下&#xff1a; 轻量快速的热重载&#xff08;HMR&#xff09;&#xff0c;能实现极速的服务启动。对 TypeScript、JSX、CSS 等支持开箱即用。真正的按需编译&#xff0c;不…

迪丽热巴留洋千金回国了吗

迪丽热巴&#xff0c;这个名字在近年来的娱乐圈中可谓是如雷贯耳。作为中国当红女演员&#xff0c;她的美貌与才华吸引了无数粉丝的目光。而近日&#xff0c;有关迪丽热巴留洋千金回国的消息引起了广泛的关注与讨论。 一直以来&#xff0c;迪丽热巴的留学经历被视为她人生中的一…

Vue-02

开发者工具 安装插件&#xff0c;用于调试 Vue 应用。 https://chrome.zzzmh.cn/index 搜索 Vue &#xff0c;下载 Vue.js Devtools &#xff0c;此插件可以帮助更新信息&#xff0c;而不通过控制台更新&#xff0c;更方便调试。 注&#xff1a;安装插件后&#xff0c;记得在插…

SpringCloud-用nacos做服务注册与调用

步骤1&#xff1a;下载和安装Nacos 首先&#xff0c;你需要从Nacos的官方网站上下载并安装Nacos Server。根据你的操作系统选择合适的版本&#xff0c;并按照官方文档中的说明进行安装和配置。 步骤2&#xff1a;创建Spring Boot项目 在你喜欢的IDE中创建一个新的Spring Boot项…

抖音视频评论挖掘工具|视频批量采集软件

抖音视频评论挖掘工具——让你轻松获取大量评论数据 抖音视频评论挖掘工具是一款基于C#开发的高效、便捷的工具&#xff0c;旨在为用户提供全面的数据采集和分析服务。无论你是想了解用户对某个话题或产品的看法&#xff0c;还是想分析评论中的热点和趋势&#xff0c;这款工具都…

Ubuntu下安装Scala

前言 弄了一下终于成功装上了&#xff0c;这里对此进行一下总结 安装虚拟机 VMware虚拟机安装Ubuntu&#xff08;超详细图文教程&#xff09;_vmware安装ubuntu-CSDN博客https://blog.csdn.net/qq_43374681/article/details/129248167Download Ubuntu Desktop | Download | …

第9章:Nginx高级应用场景《Nginx实战:从入门到精通》

随着Web技术的持续演进和业务需求的不断升级&#xff0c;Nginx早已超越了简单的Web服务器角色&#xff0c;成为了处理复杂网络请求和流量管理的多面手。在这一章中&#xff0c;我们将深入挖掘Nginx在高级应用场景中的无限潜力&#xff0c;包括构建坚如磐石的高可用性架构、实施…

【设计模式】(二)设计模式六大设计原则

一、 设计原则概述 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; ​ 1、单一职责原则&#xff08;Single Responsibitity Principle&#…

除了Gamma和tome,还有哪些值得推荐的ai写ppt工具?

如果要说时下职场中最受欢迎的ai工具&#xff0c;那一定非ai写ppt莫属&#xff0c;即使用各类基于AI人工智能技术的软件&#xff0c;来帮我们直接生成ppt&#xff0c;免去制作PPT的各个中间环节&#xff0c;包括&#xff1a;梳理框架、搜集素材、搜集图片、排版美化等&#xff…

EasyRecovery数据恢复软件2024免费试用版下载

EasyRecovery数据恢复软件有免费试用版。用户可以免费下载并扫描丢失的文件&#xff0c;通过免费的扫描功能查看需要恢复的文件是否可以进行恢复。但是&#xff0c;当需要进行文件恢复操作时&#xff0c;需要付费购买相应的版本才可解锁全部功能。 此外&#xff0c;EasyRecove…

Python处理表格数据库之Agate使用详解

概要 您是否有时觉得在处理表格数据时感到不知所措? 也许你在处理一个大型 CSV 文件,遇到了各种数据不一致的问题,或者需要验证数据,确保其准确无误才能进行下一步分析。 传统的数据分析库或许功能强大,但学习曲线陡峭,用起来有点杀鸡用牛刀的感觉。 这时,有一个更…

steam搬砖项目,“一个月赚8K+”真的假的?

Steam搬砖项目相对轻资产&#xff0c;可以在居家和兼职的情况下进行&#xff0c;适合上班族等有限时间的人群。 然而&#xff0c;即使Steam搬砖项目具有较高的收益率和稳定性&#xff0c;也需要投入一定的时间和努力来学习和理解其中的规则和技巧。有些游戏或道具的价格会随着时…

【AI视野·今日Sound 声学论文速览 第五十一期】Mon, 4 Mar 2024

AI视野今日CS.Sound 声学论文速览 Mon, 4 Mar 2024 Totally 6 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers VoxGenesis: Unsupervised Discovery of Latent Speaker Manifold for Speech Synthesis Authors Weiwei Lin, Chenhang He, Man Wai Mak, …