05.Elasticsearch应用(五)

Elasticsearch应用(五)

1.Mapping介绍

Mapping是对索引库中文档的约束,类似于数据表结构,作用如下:

  • 定义索引中的字段的名称
  • 定义字段的数据类型,例如字符串,数字,布尔等
  • 字段,倒排索引的相关配置(Analyzer)

2.映射类型

动态映射

介绍

在关系型数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段,类型,长度,主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射,在文档写入Elasticsearch时,会根据文档自动识别类型,这种机制称之为动态映射

缺点

动态映射(Dynamic Mapping)的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型。但是有时候会推算的不对,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询

自动识别的类型

在这里插入图片描述

静态映射

静态映射是在Elasticsearch中也可以实现定义好映射,包含文档的各字段类型,分词器等,这种方式称之为静态映射

3.常见的字段类型

核心类型具体类型说明
字符串类型text可分词的文本
不分词的字符串keyword精确值,例如:品牌,国家,IP地址等 不能被分词
整数类型long,integer,short,byte在ES中id应该是个字符串keyword而不是数值类型
浮点类型double,float,half_float,scaled_float
日期类型date,date_nanos
布尔类型boolean
数组类型array数组类型不存在,里面是什么就是很么类型
对象类型object
地理位置类型geo_point,geo_shape
补全类型completion自动补全功能所需要的类型
二进制类型binary
范围类型integer_range,float_range,long_range,double_range,date_range,ip_range
JSON对象数组nested

4.常见的Mapping属性

属性含义
type字段数据类型
index是否创建索引,默认为true
analyzer使用那种分词器
properties该字段的子字段
copy_to字段拷贝,可以将当前字段拷贝到指定字段
store是否单独存储。如果设置为true,则该字段能够单独查询
boost控制算分
coerce
doc_values
dynamic动态映射设置
eager_global_ordinals
enabled
fielddata
fields
format
ignore_above
ignore_malformed
index_options控制倒排索引记录的内容
index_phrases
index_prefixes
meta
normalizer
norms
null_value对NULL值进行搜索
position_increment_gap
search_analyzer
similarity
term_vector

5.能否后期更改Mapping的字段类型

两种情况

  1. 新增字段
  2. 对已有字段修改(有数据写入后)

新增字段

  1. dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
  2. dynamic设为false,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
  3. dynamic设置成strict(严格控制策略),文档写入失败,抛出异常

对已有字段修改(有数据写入后)

  1. Lucene实现的倒排索引,—旦生成后,就不允许修改
  2. 如果希望改变字段类型,必须Reindex APl,重建索引

原因

  1. 如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
  2. 但是如果是增加新的字段,就不会有这样的影响

总结

在这里插入图片描述

6.对已有字段的mapping修改

步骤

  1. 如果要推倒现有的映射, 你得重新建立一个静态索引
  2. 然后把之前索引里的数据导入到新的索引里
  3. 删除原创建的索引
  4. 为新索引起个别名, 为原索引名

索引数据迁移API

POST _reindex
{"source":{"index":"user"},"dest":{"index":"user2"}
}

使用别名兼容原有的索引

PUT /user/_alias/user

7.Dynamic Template

需求

我们可以使用动态模板来告诉es,一些字段需要动态映射成相关类型,例如根据类型来判断,或者只要是根据字段名称包含ip的,动态的给一个IP的类型,而这种思路就是es提供的动态模板,Dynamic templates

介绍

动态模板是针对某个具体的索引来设定的,即在创建某个具体的索引时指定

适用场景

  • 根据ES自动识别字段类型的这个特性,去设置一些特殊字段的名称为某些特定的类型
  • 设置所有字符串类型的字段都为 keyword
  • is 开头的字符串都设置成为 boolean 类型

三种规则

  • match_mapping_type
  • match and unmatch
  • path and path_unmatch

match_mapping_type

根据文档字段的类型进行动态映射。在这种方式下,会对JSON的数据类型进行动态定义es的数据类型。从前面,我们值JSON的数据是没有类型之分,所以es会动态根据数据本身的类型来进行映射

PUT es-learn-000002
{"mappings": {"dynamic_templates": [{"integers": {"match_mapping_type": "long","mapping": {"type": "integer"}}}]}
}

match and unmatch

根据名称的规则,来定义一些特定的动态映射,这便是动态模板的第二种方式match and unmatch。在这种方式下,字段名称的匹配支持正则表达式。match表示当字段名称符合的规则时应用,unmatch表示当字段符合规则时不应用这个动态映射

PUT es-learn-000003
{"mappings": {"dynamic_templates": [{"email_keyword": {"match":   "*_email","mapping": {"type": "keyword"}}},{"ip_rule": {"match":   "*_ip","unmatch": "long_*","mapping": {"type": "ip"}}}]}
}

注意

当我们插入嵌套的JSON的时候,动态映射的规则是应用在嵌套JSON里的对象

path_match and path_unmatch

我们知道JSON可以保存复杂的嵌套关系,那么如果我们想依据嵌套关系制定相关的动态映射的规则,该怎么处理呢?path_match和path_unmatch的用法同match和unmatch的用法相似,使用正则表达式来进行匹配。只是match匹配的是字段的值,而path_match匹配的是JSON的嵌套关系

以下这段代码想实现的效果是,name下的嵌套对象,并且不是middle名字的类型都为keyword

PUT es-learn-000005
{"mappings": {"dynamic_templates": [{"middle_name_key": {"path_match":   "name.*","path_unmatch": "*.middle","mapping": {"type": "keyword"}}}]}
}

8.索引基础操作

创建索引的时候指定Mapping

PUT /[索引名称]
{"mappings":{"properties":{"字段名":{"type":"text","analyzer":"ik_smart"},"字段名2":{"type":"keyword","index":false},"字段名3":{"properties":{"子字段":{"type":"keyword"}}}} }
}

获取索引的字段Mapping

介绍

检索一个或多个字段的映射定义。如果您不需要索引的完整映射或索引包含大量字段,这将很有用

请求路径
GET /_mapping/field/[字段名]GET /[索引名]/_mapping/field/[字段名]
请求示例
GET publications/_mapping/field/title
GET publications/_mapping/field/author.id,abstract,name
GET publications/_mapping/field/a*

获取某个索引的映射信息

GET /索引名/_mapping

9.Mapping属性解读

字段拷贝(copy_to)

介绍
  1. 该参数允许将多个字段的值复制到copy_to的字段上
  2. copy_to的字段支持查询
  3. 如果有多个字段需要查询,可以尝试把多个字段的值拷贝到一个新字段上
  4. 可以将相同的值复制到多个字段, “copy_to”: [ “field_1”, “field_2” ]
示例
PUT /[索引名]
{"mappings":{"properties":{"name":{"type":"text","analyzer":"ik_max_word","copy_to":"all"},"business":{"type":"keyword","copy_to":"all"},"all":{"type":"text","analyzer":"ik_max_word"}}}
}

index

介绍

控制当前字段是否被索引,默认为true。如果设置为false,该字段不可被搜索

示例
PUT /[索引名]
{"mappings":{"properties":{"name":{"type":"text","index":false}}}
}

index_options

介绍

控制倒排索引记录的内容

可选值
  1. docs: 记录doc id
  2. freqs: 记录doc id和term frequencies(词频)
  3. positions: 记录doc id / term frequencies / term position
  4. offsets: doc id / term frequencies / term posistion / character offects
  5. 注意: text类型默认记录postions,其他默认为docs。记录内容越多,占用存储空间越大
示例
PUT /[索引名]
{"mappings":{"properties":{"name":{"type":"text","index_options":"offsets"}}}
}

null_value

介绍

需要对NULL值进行搜索,只有keyword类型支持设计Null_value

示例
PUT /[索引名]
{"mappings":{"properties":{"name":{"type":"keyword","null_value":"NULL"}}}
}

boost

介绍

在查询时,可以增加字段的算分,默认为1

请求格式
# 创建索引时候指定
PUT /<index>
{"mappings": {"properties": {"<field>": {"type": "text","boost": 2 }}}
}# 查询时指定
POST _search
{"query": {"match" : {"title": {"query": "quick brown fox","boost": 2}}}
}
注意
  • 不提升prefix,range,fuzzy查询的分数
  • 不建议使用index time提升。而是在search time时使用

fields

介绍

text字段类型不能被排序和聚合如果要text字段能被排序或聚合可以使用fields

请求格式
PUT /<index>
{"mappings": {"properties": {"<field>": {"type":     "text","fields":{"<child_field>":{"type":"keyword"}}}}}
}

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

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

相关文章

FreeRFTOS中的临界段(代码)

前言 本片文章记录我学习FreeRTOS中的“临界段”知识点&#xff0c;同时也希望我的分享能给你带来帮助 目录 前言 一、临界段&#xff08;临界区&#xff09; 二、任务级临界段代码 三、中断级临界段代码保护 四、结语 一、临界段&#xff08;临界区&#xff09; 在Fr…

仅使用 Python 创建的 Web 应用程序(前端版本)第06章_登录页面

从本章开始,我们将创建每个页面。 本栏的例子 可以访问这里, WTS 首先是登录页面。 完成后的图像如下 创建过程如下 No类型内容1Model创建继承BaseDataModel的数据类User、Session2MockDB创建用户表并添加管理员/成员用户3Service创建AuthAPIClient、UserAPIClient4Page定义…

程序员必备的20个学习网站

今天好学编程小编整理了20个程序员必备的学习网站&#xff0c;此篇对于新手程序员比较有用&#xff0c;技术老鸟们也可以查缺补漏。话不多说&#xff0c;纯纯干货呈上&#xff0c;赶紧点个赞收藏&#xff0c;以后会用得上&#xff01; 技术网站类 1、博客园 一个面向开发者的…

SpringBoot 3.1.7 集成Kafka 3.5.0

一、背景 写这边篇文章的目的&#xff0c;是记录我在集成kafka客户端遇到的一些问题&#xff0c;文章会记录整个接入的过程&#xff0c;其中会遇到几个坑&#xff0c;如果需要最终版本&#xff0c;直接看最后一节就行了&#xff0c;感觉Spring-Kafka的文档太少了&#xff0c;如…

【github】使用github action 拉取国外docker镜像

使用github action 拉取国外docker镜像 k8s部署经常用到国外镜像&#xff0c;如果本地无法拉取可以考虑使用github action环境 github action的ci服务器在国外&#xff0c;不受中国防火墙影响github action 自带docker命令运行时直接将你仓库代码拉取下来 步骤 你的国内dock…

React16源码: React中的unwindWork的源码实现

unwindWork 1 &#xff09;概述 在 renderRoot 的 throw Exception 里面, 对于被捕获到错误的组件进行了一些处理并且向上去寻找能够处理这些异常的组件&#xff0c;比如说 class component 里面具有getDerivedStateFromError 或者 componentDidCatch 这样的生命周期方法这个c…

QT发生弹出警告窗口

QTC开发程序弹出警告窗口&#xff0c;如上图 实施代码&#xff1a; #include <QMessageBox> int main() {// 在发生错误的地方QMessageBox::critical(nullptr, "错误", "发生了一个错误&#xff0c;请检查您的操作。");}上面的文字可以更改&#x…

【学网攻】 第(5)节 -- Cisco VTP的使用

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资…

社区信息员灾情上报系统-计算机毕业设计源码13263

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

初识Docker(架构、安装Docker)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中。这些容器可以在不同的计算平台上运行&#xff0c;如Linux和Windows&#xff0c;并且可以实现虚拟化。Docker 的设计目标是提供一种快速且轻量…

【数据类型转换】C语言中的数据类型转换

1.定义 数据类型转换&#xff0c;听这个名字你就懂了&#xff0c;就是将数据从一种类型转换为另一种类型。 2.自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换&#xff0c;这种转换不需要程序员干预&#xff0c;会自动发生。比如说&#xff1a…

redis-发布缓存

一.redis的发布订阅 什么 是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可…

第四篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:机器学习

传奇开心短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文 短博文目录一、项目目标二、OpenCV机器学习介绍三、OpenCV支持向量机示例代码四、OpenCV支持向量机示例代码扩展五、OpenCVK均值聚类示例代码六、OpenCVK均值聚类示例代码扩展七、OpenCV决策树示例…

编译PCL Qt程序

使用PCL的qt程序时&#xff0c;提示不是用QVTK编译的&#xff0c;所以需要在编译VTK时打开Qt的编译选项&#xff08;由于CMakeList比较复杂&#xff0c;使用CMakeGui进行配置&#xff0c;PCL同理&#xff09;&#xff0c;编译VTK完成后&#xff0c;编译PCL也需要配置Qt支持&…

【前端web入门第一天】02 HTML图片标签 超链接标签

文章目录: 1.HTML图片标签 1.1 图像标签-基本使用1.2 图像标签-属性1.3 路径 1.3.1 相对路径 1.3.2 绝对路径 2.超链接标签 3.音频标签 4.视频标签 1.HTML图片标签 1.1 图像标签-基本使用 作用:在网页中插入图片。 <img src"图片的URL">src用于指定图像…

Python + Selenium —— 网页元素定位之Xpath定位!

前面讲的定位方式&#xff0c;都能够很方便的定位到网页元素。但是这些属性并非所有的网页元素都具备&#xff0c;可以这么说&#xff0c;绝大部分情况下都很难保证元素具备这些属性。 也就是很多时候需要使用其他的方式来定位&#xff0c;在 WebDriver 中提供了 Xpath 和 Css…

二叉树堆的应用实例分析:堆排序 | TOP-K问题

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 前言一、堆排序1.1 排序思想1.2 堆排序过程&#xff08;图解&#xff09;1.3 堆排序代…

IP数据云:实战网络安全的得力利器

在当今数字化时代&#xff0c;企业和个人面临着日益复杂和频繁的网络安全威胁。为了应对这些挑战&#xff0c;IP数据云作为一项全面的网络安全解决方案&#xff0c;已经在多个实际案例中展现了其卓越的能力。 1、识别并隔离异常行为 挑战&#xff1a;一家大型金融机构发现其内…

Github 不能访问,提示:port 22: Connection timed out

问题描述 github clone 代码出现错误&#xff1a; $ git clone gitgithub.com:Atlan4/Fnirsi1013D.git Cloning into Fnirsi1013D... ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.Please make sure you ha…

Unity 外观模式(实例详解)

文章目录 示例1&#xff1a;初始化游戏场景中的多个子系统示例2&#xff1a;管理音频播放示例3&#xff1a;场景加载流程示例4&#xff1a;UI管理器示例5&#xff1a;网络服务通信 在Unity中使用外观模式&#xff08;Facade&#xff09;时&#xff0c;主要目的是为了简化复杂子…