学好Elasticsearch系列-Mapping

news2024/12/25 22:36:28

本文已收录至Github,推荐阅读 👉 Java随想录

文章目录

    • Mapping 的基本概念
      • 查看索引 Mapping
    • 字段数据类型
      • 数字类型
      • 基本数据类型
      • Keywords 类型
      • Dates(时间类型)
      • 对象类型
      • 空间数据类型
      • 文档排名类型
      • 文本搜索类型
    • 两种映射类型
      • 自动映射:Dynamic Field Mapping
      • 显式映射 Expllcit Field Mapping
    • 映射参数
    • Text 和 Keyword 类型
      • Text 类型
        • 概述
        • 注意事项
      • Keyword 类型
        • 概述
        • 语法和语义
        • 注意事项
    • 映射模板
      • 简介
      • 用法
        • 基本语法
        • Conditions参数
      • 案例

这篇讲解Elasticsearch中非常重要的一个概念Mapping,Mapping是索引必不可少的组成部分。

Mapping 的基本概念

Mapping 也称之为映射,定义了 ES 的索引结构、字段类型、分词器等属性,是索引必不可少的组成部分

ES 中的 mapping 有点类似与关系型数据库中“表结构”的概念,在 MySQL 中,表结构里包含了字段名称,字段的类型还有索引信息等。在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性。

查看索引 Mapping

//查看索引完整的mapping
GET /index/_mappings
//查看索引指定字段的mapping
GET /index/_mappings/field/<field_name>

字段数据类型

映射的数据类型也就是 ES 索引支持的数据类型,其概念和 MySQL 中的字段类型相似,但是具体的类型和 MySQL 中有所区别,最主要的区别就在于 ES 中支持可分词的数据类型,如:Text 类型,可分词类型是用以支持全文检索的,这也是 ES 生态最核心的功能。

数字类型

  • long:64 位有符号整形。
  • integer:32 位有符号整形。
  • short:16 位有符号整形。
  • byte:8位有符号整形。
  • double:双精度 64位浮点类型。
  • float:单精度 64位浮点类型。
  • half_float:半精度 64位浮点类型。
  • scaled_float:缩放类型浮点数,按固定 double 比例因子缩放。
  • unsigned_long:无符号 64 位整数。

基本数据类型

  • binary:Base64 字符串二进制值。
  • boolean:布尔类型,接收 ture 和 false 两个值。
  • alias:字段别名。

Keywords 类型

  • keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值搜索到。如 Id、姓名这类字段应使用 keyword。
  • constant_keyword:始终包含相同值的关键字字段。
  • wildcard:可针对类似 grep 的场景。

Dates(时间类型)

  • date:JSON 没有日期数据类型,因此 Elasticsearch 中的日期可以是以下三种:
    • 包含格式化日期的字符串:例如 “2015-01-01”、 “2015/01/01 12:10:30”。
    • 时间戳:表示自"1970年 1 月 1 日"以来的毫秒数/秒数。
    • date_nanos:此数据类型是对 date 类型的补充。但是有一个重要区别。date 类型存储最高精度为毫秒,而date_nanos 类型存储日期最高精度是纳秒,但是高精度意味着可存储的日期范围小,即:从大约 1970 到 2262。

对象类型

  • object:非基本数据类型之外,默认的 json 对象为 object 类型。
  • flattened:单映射对象类型,其值为 json 对象。
  • nested :嵌套类型。
  • join:父子级关系类型。

空间数据类型

  • geo_point:纬度和经度点。
  • geo_shape:复杂的形状,例如多边形。
  • point:任意笛卡尔点。
  • shape:任意笛卡尔几何。

文档排名类型

  • dense_vector:记录浮点值的密集向量。
  • rank_feature:记录数字特征以提高查询时的命中率。
  • rank_features:记录数字特征以提高查询时的命中率。

文本搜索类型

  • text:文本类型。
  • **annotated-text:**包含特殊文本标记,用于标识命名实体。
  • completion :用于自动补全,即搜索推荐。
  • search_as_you_type: 类似文本的字段,经过优化为提供按类型完成的查询提供现成支持。
  • token_count:文本中的标记计数。

两种映射类型

自动映射:Dynamic Field Mapping

field typedynamic
true/falseboolean
小数float
数字long
objectobject
数组取决于数组中的第一个非空元素的类型
日期格式字符串date
数字类型字符串float/long
其他字符串text + keyword

除了上述字段类型之外,其他类型都必须显式映射,也就是必须手工指定,因为其他类型ES无法自动识别。

显式映射 Expllcit Field Mapping

例如:

PUT test_mapping
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "name": {
        "type": "text",
        "fields": {
          "name2": {
            "type": "keyword",
            "ignore_ above": 256
          }
        }
      },
      "age": "byte"
    }
  }
}

映射参数

  • index:是否对创建对当前字段创建倒排索引,默认 true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在 source 元数据中展示。
  • analyzer:指定分析器(character filter、tokenizer、Token filters)。
  • boost:对当前字段相关度的评分权重,默认1。
  • coerce:是否允许强制类型转换,为 true的话 “1”能被转为 1, false则转不了。
  • copy_to:该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询。
  • doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text和annotated_text)。
  • dynamic:控制是否可以动态添加新字段
    • true 新检测到的字段将添加到映射中(默认)。
    • false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式添加新字段。
    • strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映。
  • eager_global_ordinals:用于聚合的字段上,优化聚合性能,但不适用于 Frozen indices。
    • Frozen indices(冻结索引):有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据,Frozen indices 的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能是秒级或者分钟级。
  • enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,仍然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。enable的作用和index类似,区别就是enable可以对全局进行设置。例如:
PUT my_index
{
  "mappings": {
    "enabled": false
  }
}
  • fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中。
  • fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)。
  • format:格式化。例如:
"date": {
  "type":  "date",
  "format": "yyyy-MM-dd"
}
  • ignore_above:超过长度将被忽略。
  • ignore_malformed:忽略类型错误。
  • index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段。
  • Index_phrases:提升 exact_value 查询速度,但是要消耗更多磁盘空间。
  • Index_prefixes:前缀搜索。
    • min_chars:前缀最小长度> 0,默认 2(包含)
    • max_chars:前缀最大长度< 20,默认 5(包含)
  • meta:附加元数据。
  • normalizer:normalizer 参数用于解析前(索引或者查询时)的标准化配置。
  • norms:是否禁用评分(在 filter 和聚合字段上应该禁用)。
  • null_value:为 null 值设置默认值。
  • position_increment_gap:参考:https://blog.csdn.net/wlei0618/article/details/128189190
  • properties:除了mapping还可用于object的属性设置。
  • search_analyzer:设置单独的查询时分析器,如果定义了analyzer而没有定义search_analyzer,则search_analyzer的值默认会和analyzer保持一致,如果两个都没有定义,则默认是:“standard”。analyzer针对的是元数据,而search_analyzer针对的是传入的搜索词
  • similarity:为字段设置相关度算法,和评分有关。支持BM25、classic(TF-IDF)、boolean。
  • store:设置字段是否仅查询。
  • term_vector:运维参数。

Text 和 Keyword 类型

Text 类型

概述

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

注意事项

  • 适用于全文检索:如 match 查询。
  • 文本字段会被分词。
  • 默认情况下,会创建倒排索引。
  • 自动映射器会为 Text 类型创建 Keyword 字段。

Keyword 类型

概述

Keyword 类型适用于不分词的字段,如姓名、Id、数字等。如果数字类型不用于范围查找,用 Keyword 的性能要高于数值类型。

语法和语义

如当使用 keyword 类型查询时,其字段值会被作为一个整体,并保留字段值的原始属性。

GET index/_search
{
  "query": {
    "match": {
      "title.keyword": "测试文本值"
    }
  }
}

注意事项

  • Keyword 不会对文本分词,会保留字段的原有属性,包括大小写等。
  • Keyword 仅仅是字段类型,而不会对搜索词产生任何影响。
  • Keyword 一般用于需要精确查找的字段,或者聚合排序字段。
  • Keyword 通常和 Term 搜索一起用。
  • Keyword 字段的 ignore_above 参数代表其截断长度,默认 256,如果超出长度,字段值会被忽略,而不是截断,忽略指的是会忽略这个字段的索引,搜索不到,但数据还是存在的

映射模板

简介

之前讲过的映射类型或者字段参数,都是为确定的某个字段而声明的,如果希望对符合某类要求的特定字段制定映射,就需要用到映射模板:Dynamic templates。映射模板有时候也被称作:自动映射模板、动态模板等。

之前设置mapping的时候,我们明确知道字段名字,但是当我们不确定字段名字的时候该怎么设置mapping?映射模板就是用来解决这种场景的

用法

基本语法

"dynamic_templates": [
  {
    "my_template_name": { 
      ... match conditions ... 
      "mapping": { ... } 
    }
  },
  ...
]

Conditions参数

  • match_mapping_type :主要用于对数据类型的匹配。
  • match 和 unmatch:用于对字段名称的匹配。

案例

PUT test_dynamic_template

{
  "mappings": {
    "dynamic_templates": [
      {
        "integers": {
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "longs_as_strings": {
          "match_mapping_type": "string",
          "match": "num_*",
          "unmatch": "*_text",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

以上代码会产生以下效果:

  • 所有 long 类型字段会默认映射为 integer。
  • 所有文本字段,如果是以 num_ 开头,并且不以 _text 结尾,会自动映射为 keyword 类型。

本篇文章就到这里,感谢阅读,如果本篇博客有任何错误和建议,欢迎给我留言指正。文章持续更新。

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

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

相关文章

视屏消音工具,支持指定词语,或者短句消音

这里写自定义目录标题 一个使用python开发的视频消音工具 一个使用python开发的视频消音工具 1.支持上传文件字幕,进行视屏整段语句进行静音处理 2.支持通过指定的词语或者句子进行精确的消音处理 3.支持输入多个词语,或者断句进行消音处理 页面比较简陋,但功能应该满足日常使…

Vue移动端项目--瑞幸咖啡重构优化

来了客官&#xff0c;好久不见&#xff01; 从年初开始&#xff0c;就有个想法&#xff0c;想着把之前做过的项目重新整理一下。毕竟今时不同往日&#xff0c;从现在的角度去看曾经做过的项目&#xff0c;倒是觉得有很多稚嫩的地方。毕竟无论做什么都是熟能生巧&#xff0c;由浅…

【干货分享】自动化测试理论知识以及相关框架

自动化测试 1.进行自动化测试的原因&#xff1a; a.黑盒测试回归测试效率低 b.手动测试的偶然性和不确定性 c.回归的覆盖率不足 d.交付的产品质量无法保证&#xff0c;全靠评估 e.系统越复杂&#xff0c;问题越多 f.上线时间长&#xff0c;构件失败率高导致的蝴蝶效应&#xf…

分享200+个关于AI的网站

分享200个关于AI的网站 欢迎大家访问&#xff1a;https://tools.haiyong.site/ai 快速导航 AI 应用AI 写作AI 编程AI 设计AI 作图AI 训练模型AI 影音编辑AI 效率助手 AI 应用 文心一言: https://yiyan.baidu.com/ 百度出品的人工智能语言模型 ChatGPT: https://chat.openai.c…

春秋云境:CVE-2022-23880(taoCMS v3.0.2 任意文件上传漏洞)

目录 一、题目 二、进入题目&#xff1a; 2.1 文件写入一句话木马&#xff1a; 2.2 用SQL语句写入木马&#xff1a; 一、题目 靶标介绍&#xff1a; taoCMS v3.0.2 文件管理处存在任意文件上传漏洞&#xff0c;攻击者可执行任意代码 二、进入题目&#xff1a; 访问/admin …

CRM系统的作用有哪些?

CRM系统的作用具体有哪些&#xff1f;之前写过很多关于CRM选型类的内容&#xff0c;其实在介绍各大CRM软件时&#xff0c;都会大概介绍下其CRM系统的作用&#xff0c;这篇就借这个问题详细梳理下&#xff0c;CRM系统具体有哪些作用。 一个好用的CRM客户管理系统的作用包括哪些…

鸿合一体机怎么系统还原

系统还原方法&#xff1a;先用牙签按住电脑还原按钮不松&#xff0c;然后按一下电源按钮开机&#xff0c;直到电脑进入系统还原画面&#xff0c;就可以松开还原按钮了&#xff0c;系统还原完成后会自动重启&#xff0c;重启完成就可以用了。

消息队列(一)-- RabbitMQ入门(4)

RabbitMQ 其他知识点 幂等性 消息重复消费 消费者在消费MQ 中的消息时&#xff0c;MQ 已经把消息发送给消费者&#xff0c;消费者在给 MQ 返回 ack 时网络中断&#xff0c;故MQ 未收到确认消息&#xff0c;该消息会重新发给其他消费者&#xff0c;或网络重新连接后再次发给该消…

【高危】Atlassian Confluence 远程代码执行漏洞

漏洞描述 Confluence 是由 Atlassian 开发的知识管理与协同软件&#xff0c;通常在企业内部用作wiki系统。 Confluence 7.19.8到8.2.0之前的版本中存在远程代码执行漏洞&#xff0c;具有登录权限的攻击者无需用户交互即可在 Confluence 服务器中执行任意命令。 漏洞名称Atlass…

25、matlab里面的10中优化方法介绍——Opt_Golden法(matlab程序)

1.简述 基本思想 黄金分割法也称为 0.618 法&#xff0c;其基本思想是通过取试探点和进行函数值比较&#xff0c;使包含极小点的搜索区间不断缩短以逼近极小值点。适用于确定区间上的任何单谷函数求极小值的问题。 公式推导 设有定义在[ a , b ] [a,b][a,b]上的单谷函数 φ ( …

Jmeter(二十三):快速生成测试报告

一、jmeter配置 首先要保证jmeter命令是ok的,如果你在cmd中输入jmeter -v,有出现如下截图所示的信息,那就说明jmeter环境ok; 二、jmeter执行结合命令 生成HTML测试报告 1.完成脚本的调试、参数化、断言等操作。然后在聚合报告中指定日志文件存储路径,路径中最好不要包含有…

魏牌转型,别笑得太早

作者 | 魏启扬 来源 | 洞见新研社 魏牌似乎终于迎来了自己的“救世主”。 确定冲击高端智能新能源赛道&#xff0c;并且战略性放弃2000万辆的燃油车市场后&#xff0c;魏牌CEO陈思英将2023年定位为反击之年。 4月13日&#xff0c;上海车展前夕&#xff0c;魏牌推出”比‘500…

数分面试题-SQL常见面试题型1

目录标题 1、连续时间问题1.1 最近一周内的活跃天数1.2 每个用户一周内最大连续活跃天数1.3 计算截至当前&#xff0c;每个用户已经连续签到的天数 2、时间间隔问题举例3、sql窗口分析函数3.1 有一个日志登陆列表&#xff0c;获取用户在某个页面停留时长3.2 寻找至少连续出现3次…

大文件传输中的加密与安全措施

随着现代科技的不断发展&#xff0c;大文件传输已经成为了日常工作中不可或缺的一部分。但是&#xff0c;大文件传输中面临的安全问题也越来越凸显&#xff0c;因此加密与安全措施对于保护大文件传输的安全性至关重要。 一、密码学 密码学是加密与安全措施的基础&#xff0c;它…

ES6:Object.assign方法详解

ES6&#xff1a;Object.assign方法详解 1、前言2、语法3、基本用法3.1 目标对象和源对象无重名属性3.2 目标对象和源对象有重名属性3.3 有多个源对象3.4 其他情况3.4.1 只有一个参数时&#xff0c;Object.assign会直接返回该参数3.4.2 如果该参数不是对象&#xff0c;则会先转成…

[ 容器 ] Harbor 私有仓库的部署与管理

目录 一、什么是Harbor二、Harbor的特性三、Harbor的构成四、Harbor 部署五、关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数六、维护管理Harbor 一、什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户…

centos7 基础设置

CentOS 7 是一种基于 Linux 操作系统的发行版&#xff0c;它是来自于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码的重构版本。 CentOS 7 是由社区开发和维护的免费操作系统&#xff0c;被广泛应用于服务器环境和企业级应用。 CentOS 7 提供了稳定、安全且可…

OPTEE之静态代码分析实战三——optee_examples

ATF(TF-A)/OPTEE之静态代码分析汇总 一、optee_examples源码下载及分析 前文分别对optee_os和optee_client进行了静态代码分析实战,本次对optee_examples实施soanrlint静态代码分析,先到官方网站下载源码。官方网站位于github,网址optee_examples。 各发布版本如下…

windows下nginx更改配置unknown directive踩坑填坑

windows下nginx更改配置踩坑填坑 windows下nginx大坑&#xff1a;首先笔者建议了使用路径下cmd的方式启动服务&#xff0c;由于笔者更改了nginx配置文件&#xff0c;重新加载启动&#xff08;命令nginx -s reload&#xff09;nginx后一直报错&#xff0c;采用双击启动&#xff…

国际化(i18n)

国际化(i18n) 概述 i18n&#xff08;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数&#xff09;是“国际化”的简称。在信息技术领域&#xff0c;国际化与本地化&#xff08;英文&#xff1a;internationalization and localization&…