首页 > 其他分享 >ES之动态映射

ES之动态映射

时间:2022-08-22 20:37:28浏览次数:52  
标签:index1 映射 mapping 字段 文档 address 动态 ES

1. 定义

与关系型数据库不同的是其不需要先定义表结构,而可以根据写入文档的内容,来推断字段和数据类型,创建索引结构,这就是dynamic mapping,动态映射的由来。

有时这是想要的行为有时又不希望这样。
可以用 dynamic配置来控制这种行为 ,可接受的选项如下:

  • true 动态添加新的字段(默认true):根据输入文档的内容,自动推断字段和类型,创建mapping
  • false 忽略新的字段:无法根据输入文档的内容,自动创建mapping,需要手动创建mapping
  • strict 如果遇到新字段抛出异常:同非动态模式,区别在于,非动态模式,输入的文档中如果有字段不在mapping中,依然可以存储和读取,但是该字段不在mapping中,因此也无法根据该字段进行检索;但严格模式,无法存储,会直接报错,严格模式实际上就类似于关系型数据库中的表了。

2. 案例

2.1 动态模式

 

 

  • es中还没有index1索引,直接往index1中写入文档1

 

 

  •  这时候es中就有了索引index1,查询index1的mapping

 

 

可见age被推断成long型,string类型的name被推断成多字段类型,第一个类型是text,第二个类型是keyword

  • 往已有的index1中写入文档2,出现了新的字段address

 

  • 这时候address被自动加入索引mapping中

 

 

 

动态映射默认有一个规则,即请求中文档的什么json类型对应es中什么数值类型,也可以通过动态模板(dynamic template)来覆盖这个规则,实现自定义推测规则,具体可以参考ES官网。
上述字段age被推测成long类型,如果非要往age中写入string类型的值,则会报错。如下图所示

 

 

2.2 非动态模式

某些场景下,不需要进行动态映射,如需要显示设置mapping。

  • 显式设置mapping,类似于关系型数据库建表操作

 

  •  查询index2 mapping

 

  •  插入文档1,字段与mapping保持一致

 

 

  • 插入文档2,增加新的字段address

 

  •  查询index2的mappings,看是否address会自动添加到mapping中

 

  •  查询全部文档,可见文档2中的address字段值,说明存储成功

 

  •  在address字段上进行匹配查询,无法匹配到结果,将索引指定为非动态映射后,无法进行自动推断,但是该字段的值是可以被存储,可是无法在该字段上进行查询。

 

 

 

2.3 严格模式

  • 设置严格模式

 

  •  写入文档1,增加了一个字段address,直接报错,连写都写不进去了

 

 

 

标签:index1,映射,mapping,字段,文档,address,动态,ES
From: https://www.cnblogs.com/yanglei2022/p/16614133.html

相关文章

  • Codeforces Round #638 (Div. 2) B. Phoenix and Beauty(构造/思维)
    https://codeforces.com/contest/1348/problem/B如果一个数组的所有长度为k的子数组的和相同,那么这个数组就是美丽的。数组的子数组是任何连续元素的序列。Phoenix目前......
  • Presto与Hive语法差异
    Presto与Hive的语法差异示例: PrestoHive备注数组数组有动态下标,下标从1开始下标从0开始 标识符不能以数字开头命名,与java保持一致无 string......
  • 动态sql_实际应用
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernam......
  • wireshark初相识二
    使用Wireshark选择需要抓包的网络方式,并设置过滤器条件,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构。以HTTP协议为例,一帧数据包一般包括以下几......
  • [Unit testing Express] Test Express route
    server.js:importitemRouterfrom'./resources/item/item.router'exportconstapp=express()app.use('/api/item',itemRouter)item.router.jsimport{Router}......
  • Element Ui使用技巧——Form表单的校验规则rules详细说明;element的 form 表单rules详
    介绍 Form组件提供了表单验证的功能,只需要通过rules属性传入约定的验证规则,并将Form-Item的prop属性设置为需校验的字段名即可。校验规则参见async-validator文档......
  • What does Include() do in LINQ?
    WhatdoesInclude()doinLINQ?问题ItriedtodoalotofresearchbutI'mmoreofadbguy-soeventheexplanationintheMSDNdoesn'tmakeanysensetom......
  • [VSCode] REST Client Extension
    InVSCode,installRESTClinetExtension:CreateAPI_EXAMPLE.httpfileinrootfolder:###GetmockGEThttp://localhost:3000/dataHTTP/1.1###Postmock......
  • Vue3+Vite+Vant报错Uncaught SyntaxError: The requested module '/node_modules/.vit
    原因在开发过程中Vue3的依赖版本有变更,直接使用的npminstall下载新的版本,会导致node_modules下存在旧版本的缓存,从而影响了本地项目的启动编译。解决方案删除项目的......
  • Harley浅谈Linux的iptables
     简介  iptables是Linux防火墙系统的重要组成部分,iptables的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者由该设......