elasticsearch 动态映射

news2024/10/6 22:34:12

文章目录

  • 动态映射
  • 动态映射的弊端
  • 静态映射
  • 实战:映射创建后还可以更新吗

动态映射

动态映射的核心是在自动检测字段类型后添加新字段

哪些字段类型支持动态检测呢?
答:boolean类型、float类型、long类型、Object类型、Array类型、date类型、字符串类型。除此之外的类型是不支持动态检测匹配的,会适配为text类型

动态映射的弊端

1)字段匹配不准确,如将date类型匹配为keyword类型。

###字段匹配不正确
DELETE my_index_0505

PUT my_index_0505/_doc/1
{
"create_date": "2020-12-26 12:00:00"
}

GET my_index_0505/_mapping

在这里插入图片描述
获取映射发现,create_date是text和keyword组合类型,不是我们期望的date类型。

那么如何解决呢?方案如下(需要提前设置匹配规则)。

####提前设置匹配规则
DELETE my_index_0505
PUT my_index_0505
{
  "mappings": {
  "dynamic_date_formats": ["yyyy-MM-dd HH:mm:ss"]
  }
}

PUT my_index_0505/_doc/1
{
"create date": "2020-12-26 12:00:00"
}

GET my_index_0505/_mapping

在这里插入图片描述
2)字段匹配不精准,可能不是用户期望的。

举例:用户期望text类型支持ik中文分词,但默认的是standard标准分词器。对此当然也有解决方案,可借助动态模板实现。

3)占据多余的存储空间。

举例:string类型匹配为text和keyword两种类型,但实际用户极有可能只期望排序和聚合的keyword类型,或者只需要存储text类型,如网页正文内容只需要全文检索,不需要排序和聚合操作。

4)映射可能错误泛滥。

不小心写错查询语句,由于使用了PUT操作,导致映射变得非常混乱。

静态映射

我们在数据建模前,需要明确文档中各个字段的类型。如何严格禁止动态添加字段或者忽略动态添加字段呢?这些都是静态映射要解决的问题。

对于该场景,可以将dynamic参数设置为false(表示忽略新字段),或者将dynamic参数设置为strict(表示如果遇到未知字段,则引发异常)。

例如,在"dynamic":false后,cont字段可以写入,但不能被检索。

###创建索引,指定dynamic为false
PUT my_index_0506
{
    "mappings": {
        "dynamic": false,
        "properties": {
            "user": {
                "properties": {
                    "name": {
                        "type": "text"
                    },
                    "social_networks": {
                        "dynamic": true,
                        "properties": {

                        }
                    }
                }
            }
        }
    }
}


####数据可以写入成功
PUT my_index_0506/_doc/1
{
  "cont": "Each document has metadata associated"
}

###检索不能找回数据,核心原因在于cont是未映射字段
POST my_index_0506/_search
{
    "profile": true,
    "query": {
        "match": {
            "cont": "document"
        }
    }
}

### 可以返回结果
GET my_index_0506/_doc/1
####mapping中并没有 cont
GET my_index_0506/_mapping

在这里插入图片描述
代码中"profile":true辅助我们看到底层的检索逻辑,而不能召回数据的核心原因在于cont是未映射的字段。

POST my_index_0506/_doc
{
  "user.social_networks.test": "Each document has metadata associated"
}

GET my_index_0506/_doc/CsS4cY8BA63nf2PurWKA


POST my_index_0506/_search
{
    "profile": true,
    "query": {
        "match": {
            "user.social_networks.test": "document"
        }
    }
}

在这里插入图片描述
对于social_networks对象设置为"dynamic": true,可以动态映射字段类型

GET my_index_0506/_mapping

在这里插入图片描述

如果"dynamic":"strict",那么写入映射中未定义的字段会怎么样呢?


###创建索引,指定dynamic为false
PUT my_index_0507
{
    "mappings": {
        "dynamic": "strict",
        "properties": {
            "user": {
                "properties": {
                    "name": {
                        "type": "text"
                    },
                    "social_networks": {
                        "dynamic": true,
                        "properties": {

                        }
                    }
                }
            }
        }
    }
}


####数据写入失败
PUT my_index_0507/_doc/1
{
  "cont": "Each document has metadata associated"
}

在这里插入图片描述

实战:映射创建后还可以更新吗

官方文档强调已经定义的字段在大多数情况下不能更新,除非通过reindex操作来更新映射。
但以下3种情况例外。

❑Object对象可以添加新的属性。

❑在已经存在的字段里面可以添加fields,以构成一个字段多种类型。

❑ignore_above是可以更新的。

###创建索引,验证映射更新
PUT my_index_0508
{
    "mappings": {
        "properties": {
            "name": {
                "properties": {
                    "first": {
                        "type": "text"
                    }
                }
            },
            "user_id": {
                "type": "keyword"
            }
        }
    }
}


### 映射可以更新成功
PUT my_index_0508/_mapping
{
    "mappings": {
        "properties": {
            "name": {
                "properties": {
                    "first": {
                        "type": "text",
                        "fields": {
                            "field": {
                                "type": "keyword"
                            }
                        }
                    },
                    "last":{
                      "type" : "text"
                    }
                }
            },
            "user_id": {
                "type": "keyword"
            }
        }
    }
}


在以上实战中,对应第一种情况,Object对象可以添加新的属性,添加了last字段。对应第二种情况,first添加了keyword类型,以组合构造fields。对应第三种情况,user_id添加了ignore_above。

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

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

相关文章

Hive-表设计优化

Hive-表设计优化 1.Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表。 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时,默认将其转换为分布式计算MapReduce程序对HDFS中的数据进行读取处理的过程。 当执行…

黑马甄选离线数仓项目day02(数据采集)

datax介绍 官网: https://github.com/alibaba/DataX/blob/master/introduction.md DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre…

48-Qt控件详解:Buttons Containers2

一 Group Box:组合框 #include "widget.h"#include<QGroupBox> #include<QRadioButton> #include<QPushButton> #include<QVBoxLayout>//可以在水平方向和垂直方向进行排列的控件&#xff0c;QHBoxLayout/QVBoxLayout #include <QGridLa…

Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…

新增柱线组合图、象限图,新增钉钉、飞书、企业微信客户端免密登录,DataEase开源数据可视化分析工具v2.6.0发布

2024年5月13日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.6.0版本。 这一版本的功能升级包括&#xff1a;图表方面&#xff0c;新增了柱线组合图、象限图&#xff1b;仪表板方面&#xff0c;支持批量拖拽字段&#xff0c;外部参数新增支持配置过滤组件&…

云原生基础设施和操作系统分论坛 03-在Kubernetes上运行Apache Spark进行大规模数据处理的实践【数据分析】

https://spark.apache.org/视频观看&#xff1a;https://www.bilibili.com/video/BV17J4m1n7Gv/?spm_id_from333.999.0.0 简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop…

/proc/modules文件

/proc/modules文件中列出了内核加载的所有模块的信息&#xff0c;与使用lsmod命令类似。 第一列&#xff1a;模块名称 第二列&#xff1a;模块使用的内存大小&#xff0c;单位是bytes 第三列&#xff1a;模块被load的次数 第四列&#xff1a;是否有其他模块依赖此模块&#…

git使用及github

文章目录 操作命令基本组成框架在开发中git分支的重要性 github的使用将本地仓库关联到远程仓库将远程仓库关联到本地和拉取指定分支、切换远程分支提交本地仓库到远程仓库修改分支名称 保存当前工作切换分支将别的分支修改转移到自己的分支远程删除分支后本地git branch -a依然…

基于NTP服务器获取网络时间的实现

文章目录 1 NTP1.1 简介1.2 包结构1.3 UNIX 时间戳和NTP时间戳 2 代码实现2.1 实现步骤2.2 完整代码 3 结果 在某些场景下&#xff0c;单片机需要通过网络获取准确的时间进行数据同步&#xff0c;例如日志记录、定时任务等。然而&#xff0c;单片机本身无法直接获得准确的标准时…

Vue+springboot的批量删除功能

vue前台 <div style"margin-bottom: 10px"><el-button type"primary" plain click"handleAdd">新增</el-button><el-button click"delBatch" type"danger" plain style"margin-left: 5px"…

自学新标日第十三课(完结)

第十三课 单词 单词假名声调词义荷物にもつ1包裹はがきはがき0明信片切手きって0邮票引き出しひきだし0抽屉アルバムあるばむ0相册タバコたばこ0烟草漫画まんが&#xff10;ガレージ&#xff12;车库修理しゅうり&#xff11;生ビールなまビール3生啤焼き鳥やきとり0烤鸡肉串…

I. Integer Reaction

Problem - I - Codeforces 看到最小值最大值&#xff0c;二分答案。 思路&#xff1a;每次二分时开两个集合&#xff0c;分别表示 0 0 0颜色和 1 1 1颜色。如果是 c c c颜色&#xff0c;先将值存入 c c c颜色&#xff0c;之后在 ! c !c !c颜色中找大于等于 m i d − a mid - a…

a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题

a-auto-complete 请求后端数据做模糊查询&#xff0c;解决下拉框选择选不上&#xff0c;不回显的问题 记录一个a-auto-complete卡bug卡了两天&#xff0c;找不到哪里的问题下拉框选择选不上&#xff0c;不回显&#xff0c;最后终于解决了。 我还对下拉框显示的内容做了小调整。…

【简单探索微软Edge】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

人工智能引领工业园区智能化升级:AI视频监测助力安全生产管理

当前&#xff0c;许多工业园区面临着一个共同的挑战&#xff1a;大量的监控视频处于“沉睡”状态&#xff0c;无法主动预警风险&#xff0c;需要人工持续盯防。同时&#xff0c;由于生产现场工况复杂&#xff0c;高危场景的巡检工作不仅增加了人员的暴露频次&#xff0c;而且在…

面试中的算法(查找缺失的整数)

在一个无序数组里有99个不重复的正整数&#xff0c;范围是1~100&#xff0c;唯独缺少1个1~100中的整数。如何找出这个缺失的整数? 一个很简单也很高效的方法&#xff0c;先算出1~100之和&#xff0c;然后依次减去数组里的元素&#xff0c;最后得到的差值&#xff0c;就是那个缺…

LLM应用-文档解析 AI大模型总结分析文档

1&#xff09;https://notegpt.io/pdf-summary 支持总结&#xff0c;思维导图、对话 2&#xff09;chatdoc https://chatdoc.com/ 3&#xff09;chatpdf https://www.chatpdf.com/ https://www.chatpdfs.cn/ 4&#xff09;kimi https://kimi.moonshot.cn/

Vue3实战Easy云盘(三):文件删除+文件移动+目录导航+上传优化/文件过滤/搜索

一、文件删除 &#xff08;1&#xff09;选中了之后才可以删除&#xff0c;没有选中时就显示暗调删除按钮 &#xff08;2&#xff09;实现选中高亮功能 &#xff08;3&#xff09;单个删除 &#xff08;4&#xff09;批量删除 Main.vue中 <!-- 按钮3 --><!-- 如果sel…

gin框架学习笔记(二) ——相关数据与文件的响应

前言 在看是今天的内容之前&#xff0c;我们收先来探究一下&#xff1a;什么是Web应用工作的原理&#xff1f;当然这个问题其实论述起来是很麻烦的&#xff0c;但是我们将它无限的缩小&#xff0c;其实可以简化为一个C/S模型&#xff0c;客户端(Client)负责发送请求&#xff0…

深入理解C#中的IO操作:Path类的详解

文章目录 前言一、Path类的概述二、Path类的主要方法2.1 Path.GetFullPath(string relativePath)2.2 Path.GetDirectoryName(string path)2.3 Path.GetFileName(string path)2.4 Path.GetFileNameWithoutExtension(string path)2.5 Path.GetExtension(string path)2.6 Path.Com…