架构师系列-搜索引擎ElasticSearch(六)- 映射

映射配置

        在创建索引时,可以预先定义字段的类型(映射类型)及相关属性。

        数据库建表的时候,我们DDL依据一般都会指定每个字段的存储类型,例如:varchar、int、datetime等,目的很明确,就是更精确的存储数据,防止数据类型格式混乱,在Elasticsearch中也是这样,创建索引的时候一般也需要指定索引的字段类型,这种方式称为映射(Mapping)。

被动创建(动态映射)

        此时字段和映射类型不需要事先定义,只需要存在文档的索引,当向此索引添加数据的时候当遇到不存在的映射字段,ES会根据数据内容自动添加映射字段定义。使用动态映射的时候,根据传递请求数据的不同会创建对应的数据类型。

禁止动态映射

一般生产环境下需要禁用动态映射,使用动态映射可能出现以下问题

  1. 造成集群元数据一直变更,导致不稳定;
  2. 可能造成数据类型与实际类型不一致;

禁用动态映射,动态mappingdynamic字段进行配置,可选值及含义如下

  • true:支持动态扩展,新增数据有新的字段属性时,自动添加对于的mapping,数据写入成功
  • false:不支持动态扩展,新增数据有新的字段属性时,直接忽略,数据写入成功
  • strict:不支持动态扩展,新增数据有新的字段时,报错,数据写入失败

主动创建(显示映射)

我们需要对字段除了数据结构定义更多的限制的时候,动态映射创建的内容很可能不符合我们的需求,所以可以使用PUT {index}/mapping来更新指定索引的映射内容。

映射类型

我们要创建映射必须还要知道映射类型,否则就会走默认的映射类型,下面我们看看常用的映射类型。

准备工作

# 创建一个索引
PUT mapping_demo

 字符串类型

符串类型可以被设置为以下几种类型

 text

当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型,text类型会被分词。设置text类型以后,字段内容会被分词,在生成倒排索引以前,字符串会被分析器分成一个一个词项,text类型的字段不用于排序,很少用于聚合 。

keyword

keyword类型不会被分词,常用于关键字搜索,比如姓名、email地址、主机名、状态码和标签等。如果字段需要进行过滤(比如查姓名是张三发布的博客)、排序、聚合,keyword类型的字段只能通过精确值搜索到,常常被用来过滤、排序和聚合。

两者区别

它们的区别在于text会对字段进行分词处理而keyword则不会进行分词。如果字段是text类型,存入的数据会先进行分词,然后将分完词的词组存入索引,而keyword则不会进行分词,直接存储,这样划分数据更加节省内存。

使用案例 

先创建一个映射,name是keyword类型,描述是text类型的

PUT mapping_demo/_mapping
{"properties": {"name": {"type": "keyword"},"city": {"type": "text","analyzer": "ik_smart"}}
}# 插入数据
PUT mapping_demo/_doc/1
{"name":"北京小区","city":"北京市昌平区回龙观街道"
}# 对于keyword的name字段进行精确查询
GET mapping_demo/_search
{"query": {"term": {"name": "北京小区"}}
}# 对于text的city进行模糊查询
GET mapping_demo/_search
{"query": {"term": {"city": "北京市"}}
}

 数字类型

数字类型也是我们最常用的类型之一,下面我们看下数字类型的使用。

  • 在满足需求的情况下,优先使用范围小的字段,字段长度越小,索引和搜索的效率越高。

日期类型 

 JSON表示日期

JSON没有表达日期的数据类型,所以在ES里面日期只能是下面其中之一。

  • 格式化的日期字符串,比如:"2015-01-01" or "2015/01/01 12:10:30"
  • 用数字表示的从新纪元开始的毫秒数
  • 用数字表示的从新纪元开始的秒数(epoch_second)

ES如何处理日期

        在ES的内部,时间会被转换为UTC时间(如果声明了时区)并使用从新纪元开始的毫秒数的长整形数字类型的进行存储,在日期字段上的查询,内部将会转换为使用长整形的毫秒进行范围查询,根据与字段关联的日期格式,聚合和存储字段的结果将转换回字符串。

默认日期格式

日期的格式可以被定制化的,如果没有声明日期的格式,它将会使用默认的格式。

"strict_date_optional_time||epoch_millis" 

意味着它将会接收带时间戳的日期,它将遵守strict_date_optional_time限定的格式(yyyy-MM-dd'T'HH:mm:ss.SSSZ 或者 yyyy-MM-dd)或者毫秒数。

日期格式示例

PUT mapping_demo/_mapping
{"properties": {"datetime": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}}
}
# 添加数据
PUT mapping_demo/_doc/2
{"name":"河北区","city":"河北省小区","datetime":"2022-02-21 11:35:42"
}

日期类型参数

布尔类型 

boolean类型用于存储文档中的true/false

范围类型

范围类型字段中存储的内容就是一段范围,例如年龄30-55岁,日期在2020-12-28到2021-01-01之间等。

es中有六种范围类型:

  • integer_range
  • float_range
  • long_range
  • double_range
  • date_range
  • ip_range

使用实例 

PUT mapping_demo/_mapping
{"properties": {"age_range": {"type": "integer_range"}}
}# 指定年龄范围,可以使用 gt、gte、lt、lte。
PUT mapping_demo/_doc/3
{"name":"张三","age_range":{"gt":20,"lt":30}
}

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

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

相关文章

getLocation需要在app.json中声 明permission字段

这是我在使用微信小程序的时候 获取本机地址的时候会出现的这个问题 这个问题很好解决 获取本地定位的代码也很简单 wx.getLocation({// 国内只能使用gcj02坐标系,wgs84不能使用;高德地图等都是使用的gcj02type: "gcj02",success: function (…

STM32之DHT11温湿度传感器

目录 一 DHT11温湿度传感器简介 1.1 传感器特点 1.2 传感器特性 1.3 传感器引脚说明 二 测量原理及方法 2.1 典型应用电路 2.2 单线制串行简介 2.2.1 串行接口 (单线双向) 2.2.2 数据示例 2.3 通信时序 三 单片机简介 3.1 STM32F103C8T6最小系统板 四 接线说明 …

011、Python+fastapi,第一个后台管理项目走向第11步:建立python+fastapi项目,简单测试一下

一、说明 本文章就是记录自己的学习过程,如果有用您可以参考,没用你就略过,没有好与不好之分,今天主要是参考了gitee上的一些项目,一步一步的往后i建立 对于学习来说,如果您有java c等经验,py…

wpf下RTSP|RTMP播放器两种渲染模式实现

技术背景 在这篇blog之前,我提到了wpf下播放RTMP和RTSP渲染的两种方式,一种是通过控件模式,另外一种是直接原生RTSP、RTMP播放模块,回调rgb,然后在wpf下渲染,本文就两种方式做个说明。 技术实现 以大牛直…

云轴科技ZStack支持国家地震烈度速报与预警工程实现秒级地震预警能力

编者按:巨灾项目,作为国家公共安全体系的重要组成部分,对于提升我国防灾减灾能力具有举足轻重的意义。其中,地震预警作为巨灾项目的重要一环,其技术的创新与应用直接关系到人民群众的生命财产安全。云轴科技ZStack在国…

vite配置eslint24年4月期,eslint.config.js

一、背景 最新版的eslint,默认init之后为eslint.config.js,整体配置较之前版本均有变动; vite&ts版本。 1.1 安装 pnpm i eslint -D1.2 初始化 npx eslint --init npx eslint --init Need to install the following packages:eslint/…

数据库基本介绍

目标:了解数据库的功能和常见数据库分类、数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1、数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库:database(DB),是一种存储数据的仓库 数…

Python3+Appium+Android SDK+真机+实现app自动化测试-基于Red Hat7.9版本搭建环境及运行python脚本。

1、总体概述? 收费有收费的服务,那就是细致。Red Hat9.0自动化环境也有,需要的说一声。 1、实现在Red Ha/t Enterprise Linux7.9环境中搭建部署app自动化测试环境,提供详细步骤。 2、版本说明:jdk8/17+nodejs16/18/19/20/21+android sdk29+python3.9.18/3.11.1+appium1…

RT-thread信号量与互斥量

1,信号量 信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。理解资源计数适合于线程间工作处理速度不匹配的场合;信号量在大于0时才能获取,在中断、线程中均可释放信号量。 为了体现使用信号量来达到线程间的同步,…

qemu源码解析一

基于qemu9.0.0 简介 QEMU是一个开源的虚拟化软件,它能够模拟各种硬件设备,支持多种虚拟化技术,如TCG、Xen、KVM等 TCG 是 QEMU 中的一个组件,它可以将高级语言编写的代码(例如 C 代码)转换为可在虚拟机中…

稀碎从零算法笔记Day49-LeetCode:设计哈希集合

题型:模拟 链接:705. 设计哈希集合 - 力扣(LeetCode) 来源:LeetCode 题目描述 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key) 向哈…

关闭win10搜索中的热门搜索广告

任务目标,关闭掉这个煞笔热门搜索功能 1.首先WinR快捷键,输入“regedit”来打开注册表 2.在注册表中定位到计算机\HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows 并在Windows下新建“项”,命名为“Explorer”,并在这新…

Python大数据分析——一元与多元线性回归模型

Python大数据分析——一元与多元线性回归模型 相关分析概念示例 一元线性回归模型概念理论分析函数示例 多元线性回归模型概念理论分析示例 线性回归模型的假设检验模型的F检验理论分析示例 模型的T检验理论分析示例 相关分析 概念 a 正相关;b 负相关;c…

【leetcode面试经典150题】32.串联所有单词的子串(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

2024 十五届蓝桥杯省赛Python B组

以下仅是我的答案,仅供参考,欢迎讨论。 A:穿越时空之门 二进制、四进制转换。答案:63。 B:数字串个数 排除0,总的方案数9^10000,减去不存在3和不存在7的2*8^10000,再加上同时不存在3和7的7^…

RedisTemplate

3.3.RedisTemplate 在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。 下面,我们…

Vue3---基础8(生命周期)

生命周期 Vue组件在创建时要经历一系列的初始化步骤,在此过程中Vue会在合适的时机,调用特定的函数,从而让开发者有机会在特定阶段运行自己的代码,这些特定的函数统称为:生命周期钩子 Vue2 在Vue2中,组件的生…

InnoDB中高度为3的B+树最多可以存多少数据?

参考: 🔥我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知? - 掘金 考虑到磁盘IO是非常高昂的操作,计算机操作系统做了预读的优化,当一次IO时,不光把当前磁盘地址的数据,…

计算机网络常问面试题

一.HTTPS是如何保证安全传输的 https通过使⽤对称加密、⾮对称加密、数字证书等⽅式来保证数据的安全传输。 客户端向服务端发送数据之前,需要先建⽴TCP连接,所以需要先建⽴TCP连接,建⽴完TCP连接后,服务端会先给客户端发送公钥…

CentOS 设置静态 IP 配置

防止 CentOS 服务器的 IP 地址更改,可以设置静态 IP 配置,而不是依赖 DHCP(动态主机配置协议)分配 IP 地址。 以下是在 CentOS 上配置静态 IP 地址步骤: 1. 编辑网络配置文件 打开配置文件。配置文件通常位于 /etc/s…