elasticsearch 动态映射

文章目录

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

动态映射

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

哪些字段类型支持动态检测呢?
答: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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MQTT学习(一)

MQTT是一种与HTTP类似的应用层协议。 在某些物联网应用中,MQTT优于HTTP。 首先,HTTP是用于客户端服务器计算的以文档为中心的请求-响应协议。 HTTP是万维网的基础,但它不是专门为机器之间通信而设计的。 MQTT是一种机器对机器、以数据为中…

重学java 37.多线程基本了解

尽管走自己的路,别被那些三言两语击倒 —— 24.5.13 一、多线程_线程和进程 进程:在内存中执行的应用程序 线程:是进程中最小的执行单元线程作用:负责当前进程中程序的运行,一个进程中至少有一个线程,一个进程还可以有多个线程,这…

Automa:一键自动化,网页数据采集与工作流程优化专家

Automa:解锁自动化浏览器潜能,赋能工作效率,让复杂任务变得简单- 精选真开源,释放新价值。 概览 Automa是一款创新的网页自动化工具,专为寻求提升工作效率、简化数据收集过程的现代工作者设计。它融合了先进的数据抓取…

EasyExcel 中实体类的注解@ExcelProperty

ExcelProperty(value "职务", index 0) value 与index 的优先级, 实测得出下面结论. 1、只有value : 按照value 的匹配 2、只有index: 按照index 的匹配 3、 同时有value和index: 按照index的匹配. 结果: 按照index的匹配, 找到的数据 {"administrat…

GO—web程序中的请求缓存设置

背景 假设用户数据存在数据库,现在需要一个函数,通过用户名称返回用户信息。 期望:在一次web请求中,不过调用多少次这个函数,只请求一次数据库。 基本信息 type User struct {Name stringAge int }func GetALLUser…

服务器3389端口,服务器3389端口风险提示的应对措施

3389端口是Windows操作系统中远程桌面协议(RDP)的默认端口。一旦该端口被恶意攻击者利用,可能会导致未经授权的远程访问和数据泄露等严重安全问题。 针对此风险,强烈建议您采取以下措施: 1. 修改默认端口:…

苹果手机系统恢复工具:轻松解决iPhone各类系统问题!

随着苹果手机的iOS系统不断升级,越来越多的系统问题不断出现,如卡在恢复模式、系统崩溃白苹果、应用无响应、等,这些问题不仅影响用户体验,还可能导致手机无法正常使用。 遇到系统问题,一般我们可以先尝试使用强制重启…

【原创】springboot+mysql校园宿舍报修管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

景源畅信:小白如何做抖音电商怎么样?

在数字浪潮中崛起的抖音电商,以其独特的平台优势吸引了众多创业者的目光。特别是对于初入电商领域的“小白”来说,如何在这个全新的领域站稳脚跟,成为他们迫切需要解答的问题。接下来,我们将深入探讨小白如何在抖音电商中开辟属于…

免费思维13招之十:增值型思维

免费思维13招之十:增值型思维 免费思维的另一大战略思维——增值型思维。 为了提高客户的粘性而促进重复性消费,我们必须对客户进行免费的增值型服务。 大家不要把增值型思维与赠品型思维混淆,增值型思维重心在于提高与消费者的粘性而促进重复消费,重心在后端。而赠品型思…

Spring Cloud Alibaba 分布式配置中心(9)

项目的源码地址 Spring Cloud Alibaba 工程搭建(1) Spring Cloud Alibaba 工程搭建连接数据库(2) Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3) Spring Cloud Alibaba Ribbo…

【简单介绍下Milvus】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

vue3专栏项目 -- 四、前后端结合(下)

一、async 和 await 1、使用async 和 await 改造异步请求 在接触后端API以后就遇到了越来越多的异步请求,现在我们就使用async 和 await 改造异步请求。 async function是把返回内容包裹成个Promise返回Promise await 它在async function里面才起作用&#xff0…

互联网轻量级框架整合之SpringIoC概念详解

在之前的几篇文字中说道容器的概念,实际上Spring也是基于容器的理念,之所以如此成功并不是因为很先进的技术,而是因为理念,其中核心便是IoC(控制反转),AOP(面向切面编程),其中IoC是Spring的基础&#xff0c…

腐烂的橘子 - (LeetCode)

一、概述 994. 腐烂的橘子 - 力扣(LeetCode),今天刷到这道题,开始按照自己实现的思路写了一次,通过了调试,但是提交的时候,来了一个大的数据,就没有通过测试,百思不得其…

commvault学习(7):恢复oracle

在实际生产环境中,oracle的恢复方式大部分是异机恢复。 环境: 备份机:windows server2008,ip:192.168.20.56 恢复目标机:windows server2008,ip:192.168.20.55 CS、MA&#xff1…

进程和计划任务管理

查看系统进程信息 静态查看系统进程信息之ps命令 (每五秒刷新一次数据) 方法一:ps aux //显示所有进程 a:显示现行终端下的所有进程,包括其它用户的进程。u:显示进程的归属用户及内存的使用情况。x…

今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)

软件课题:Python实现打印100内数学试题软件及开发过程 一、需求管理: 1.实现语言:Python 2.打印纸张:A4 3.铺满整张纸 4.打包成exe 先看效果: 1. 2.电脑打印预览 3.打印到A4纸效果(晚上拍的&#x…

Java入门基础学习笔记22——程序流程控制

程序流程控制:控制程序的执行顺序。 程序有哪些执行顺序? 顺序、分支和循环。 分支结构: if、switch 循环: for、while、do-while 顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中,哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号,从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结