【ES实战】索引mapping的动态设置

2023-11-11

动态mapping


fieldmapping类型在使用之前不需要定义。由于有了动态映射,在向索引写入数据的时候,就可以自动添加新的字段名。新字段可以添加到顶级映射类型中,也可以添加到内部对象和嵌套字段中。

mapping下的dynamic配置项控制是否可以动态添加新字段。它接受三种设置:

  • true
    将新检测到的字段添加到映射中。 (default)
  • false
    新检测到的字段将被忽略。这些字段不会被索引,因此不能被搜索,但仍然会出现在返回的命中的_source字段中。这些字段不会被添加到映射中,新字段必须显式添加。
  • strict
    如果检测到新字段,则抛出异常并拒绝文档。新字段必须显式添加到映射中。

也就是说在使用动态mapping的前提就是需要将dynamic配置项采用默认项。

PUT my_index20221022001
{
    "mappings": {
        "_doc": {
            "dynamic": "strict",
            "properties": {
                "age": {
                    "type": "text"
                }
            }
        }
    }
}

动态模板允许在一定规则下进行自定义映射。可以配置动态映射规则来定制用于新字段的映射。对于已经存在配置好的字段,不生效。

动态mapping规则

动态模板允许基于下列规则将你定义自定义映射应用到动态添加的字段:

  • Elasticsearch检测到的数据类型,与match_mapping_type

  • 字段名称,用matchunmatchmatch_pattern

  • 字段的完整带点路径,并带有path_matchpath_unmatch

原始字段名{name}和检测到的数据类型{dynamic_type}。模板变量可以作为占位符在映射规范中使用。

只有当一个字段包含一个具体的值时,动态字段映射才会被添加,而不是空或空数组。这意味着,如果在动态模板中使用null_value选项,它将只在第一个有具体值的字段的文档被索引后才被应用。

语法规则

动态模板被指定为一个命名对象的数组。

"dynamic_templates": [
    {
      "my_template_name": {  // 模板名称可以是任何字符串值。
        ...  match conditions ... // 匹配条件可以包括以下任何一项:match_mapping_type, match, match_pattern, unmatch, path_match, path_unmatch。
        "mapping": { ... } // 匹配字段应使用的映射。
      }
    },
    ...
  ]

模板是按顺序处理的,第一个匹配的模板获胜。当通过put mapping API放入新的动态模板时,所有现有的模板都被覆盖。这允许动态模板在最初添加后被重新排序或删除。

match_mapping_type

match_mapping_type是由json解析器检测到的数据类型。由于JSON不允许区分长数和整数或双数和浮点数,它将总是选择更广泛的数据类型,即长数用于整数,双数用于浮点数。

以下数据类型可以被自动检测到:

  • boolean :当遇到truefalse时,字段的类型为 boolean
  • date :当日期检测被启用并且发现一个字符串与任何配置的日期格式相匹配时,这个字段被设置成date
  • double :当数据拥有小数部分,字段类型为double
  • long :没有小数部分的数字,字段类型为long
  • objectobject表示对象,也叫哈希。
  • stringstring用于字符串。

*,可以理解为通配符,也可以用来匹配所有数据类型。

例如,如果我们想把所有的整数字段映射为integer而不是long,把所有的string字段映射为textkeyword,我们可以使用以下模板。

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "integers": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "integer"
            }
          }
          
        },
        {
          "strings": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "fields": {
                "raw": {
                  "type":  "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        }
      ]
    }
  }
}

PUT my_index/_doc/1
{
  "my_integer": 5, // my_integer字段被映射为一个整数。
  "my_string": "Some string" // my_string字段被映射为一个text,有一个keywords的多字段。
}
match and unmatch

参数match使用一个模式来匹配字段名,而unmatch使用一个模式来排除match匹配的字段。

下面的例子匹配所有名称以long_开头的string字段(以_text结尾的字段除外),并将它们映射为long字段。

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "longs_as_strings": {
            "match_mapping_type": "string",
            "match":   "long_*",
            "unmatch": "*_text",
            "mapping": {
              "type": "long"
            }
          }
        }
      ]
    }
  }
}

PUT my_index/_doc/1
{
  "long_num": "5", //long_num字段被映射为一个long。
  "long_text": "foo" //long_text字段使用默认的字符串映射。
}
match_pattern

match_pattern参数调整了match参数的行为,例如,它支持字段名上的完整Java正则表达式匹配,而不是简单的通配符。

  "match_pattern": "regex",
  "match": "^profit_\d+$"
path_match and path_unmatch

path_matchpath_unmatch参数的工作方式与matchunmatch相同,但对字段的完整点状路径进行操作,而不仅仅是最终名称,例如:some_object.*.some_field

这个例子将name对象中的任何字段的值复制到顶层的full_name字段,除了middle字段。

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "full_name": {
            "path_match":   "name.*",
            "path_unmatch": "*.middle",
            "mapping": {
              "type":       "text",
              "copy_to":    "full_name"
            }
          }
        }
      ]
    }
  }
}

PUT my_index/_doc/1
{
  "name": {
    "first":  "Alice",
    "middle": "Mary",
    "last":   "White"
  }
}
{name} and {dynamic_type}

{name}{dynamic_type}占位符在mapping中被替换成字段名和检测到的动态类型。下面的例子将所有字符串字段设置为使用与字段名称相同的analyzer,并对所有非字符串字段禁用doc_values

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "named_analyzers": {
            "match_mapping_type": "string",
            "match": "*",
            "mapping": {
              "type": "text",
              "analyzer": "{name}"
            }
          }
        },
        {
          "no_doc_values": {
            "match_mapping_type":"*",
            "mapping": {
              "type": "{dynamic_type}",
              "doc_values": false
            }
          }
        }
      ]
    }
  }
}

PUT my_index/_doc/1
{
  "english": "Some English text", // The english field is mapped as a string field with the english analyzer.
  "count":   5  // 在禁用doc_values的情况下,count字段被映射为一个长字段。.
}

使用场景

只进行全文检索

如果字符串字段只进行全文搜索,不打算在字符串字段上运行聚合、排序或精确搜索,可以告诉Elasticsearch只把它映射为一个文本字段(这是5.0之前的默认行为)。

PUT my_index
{
 "mappings": {
   "_doc": {
     "dynamic_templates": [
       {
         "strings_as_text": {
           "match_mapping_type": "string",
           "mapping": {
             "type": "text"
           }
         }
       }
     ]
   }
 }
}

不考虑检索评分情况

Norms 是索引时的评分因素。如果你不关心评分,例如,如果你从不按分数对文件进行排序,你可以在索引中禁用这些评分因素的存储,以节省一些空间。

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "strings_as_keywords": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "norms": false,
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        }
      ]
    }
  }
}

keyword字段出现在这个模板中是为了与动态映射的默认规则一致。当然,如果你不需要它们,因为你不需要对这个字段进行精确的搜索或聚合,可以把它删除。

时序数据

在使用Elasticsearch进行时间序列分析时,通常会有许多数字字段,你会经常对这些字段进行汇总,但从不进行过滤。在这种情况下,你可以禁用这些字段的索引,以节省磁盘空间,也可能获得一些索引速度。主要应用是监控类型场景。

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "unindexed_longs": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "long",
              "index": false
            }
          }
        },
        {
          "unindexed_doubles": {
            "match_mapping_type": "double",
            "mapping": {
              "type": "float", // 像默认的动态映射规则一样,双数被映射为浮点数,通常足够精确,但需要一半的磁盘空间。
              "index": false
            }
          }
        }
      ]
    }
  }
}

英文原文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ES实战】索引mapping的动态设置 的相关文章

  • Elasticsearch 单个字段的多个分析器

    我使用严格的预定义映射将不同类型的文档存储在单个索引中 它们都有一些字段 例如 body 但我希望在索引时对它们进行稍微不同的分析 例如 对特定文档使用不同的标记过滤器 并在搜索时以相同的方式处理 据我所知 分析器不能按文档指定 我还考虑使
  • 我们可以同时使用拼音标记和同义词吗?

    我正在尝试同时启用语音分析器和同义词 这似乎不起作用 它们一起使用有错吗 在下面的实现中 我希望使用同义词转换搜索查询 然后使用语音分析器来检索结果 但我的同义词在这里完全被忽略了 如果我在创建索引时删除语音分析器 那么同义词就可以正常工作
  • 弹性搜索文档计数

    我正在运行 2 2 版本的 Elastic 搜索 我已经创建了索引并加载了示例文档 我发现其中有些问题 当我给予 GET index type count 我得到了正确的答案 count 9998 shards total 5 succes
  • search_after 在弹性搜索中如何工作?

    我一直在尝试在我们的应用程序中使用 Elasticsearch 但分页限制为 10k 对我们来说实际上是一个问题 并且由于必须超时问题 滚动 API 也不是推荐的选择 我发现 Elasticsearch 有一个叫做 search after
  • Elasticsearch 数组必须和must_not

    我的 elasticsearch 数据库中有一个如下所示的文档 tags gt tag 1 tag 2 tag 3 tag A created at gt 2013 07 02 12 42 19 UTC label gt Mon super
  • 如何增加vm.max_map_count?

    我正在尝试在 Ubuntu EC2 计算机 t2 medium 中运行弹性搜索 但我收到消息 最大虚拟内存区域 vm max map count 65530 太低 至少增加到 262144 我怎样才能增加vm max map count v
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • Elastic Search 索引经常被删除[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 google cloud 上对个人项目运行弹性搜索 并将其用作我的应用程序的搜索索引 从最近三天开始 索引就被神秘地删除了 我不知
  • Elasticsearch:预期的字段名称,但得到了 START_OBJECT

    我一直在尝试运行以下查询 但每次运行时都会收到以下错误 nested ElasticsearchParseException Expected field name but got START OBJECT field value fact
  • AWS ElasticSearch Service - 从 CF 模板设置加密选项

    我正在创建一个云形成模板来在AWS中配置elasticsearch服务域 我想将加密下的此属性设置为 true 域的所有流量都需要 HTTPS 但我无法在 AWS 文档中找到执行此操作的方法 用于设置加密属性的其他选项 例如 启用静态数据加
  • 在“spring-data-elasticsearch”4.0.4.RELEASE中,如何将SearchHits转换为Page?

    In spring data elasticsearch4 0 4 发布 ElasticsearchRestTemplate s queryForPage 方法已弃用 需要使用search 相反 它返回SearchHits代替Page 那么
  • Java ElasticSearch 配置的节点均不可用

    过去一小时刚刚下载并安装了elasticsearch 1 3 2 打开 IPtables 端口 9200 和 9300 9400 在 etc hosts 中设置我的计算机名称和 ip 头部模块和护理人员安装并运行顺利 本地主机上的curl
  • Elasticsearch 日期范围交集

    我在弹性搜索中存储类似以下信息的信息 timeslot start at 2013 02 01 timeslot end at 2013 02 03 鉴于我有另一个日期范围 例如 从用户输入给出 我想搜索相交的时间范围 与此类似 确定两个日
  • Elasticsearch 可搜索合成字段

    假设源文档 JSON 中存在几个名为的字段 a and b 属于类型long 我想构建一个综合字段 例如c 通过用下划线连接前面字段的值和 将其索引为keyword 也就是说 我正在研究一个可以通过如下虚构的部分映射来支持的功能 a typ
  • 在 Must bool 查询中使用正则表达式搜索与使用 Must_not bool 查询

    我想进行类似的查询 获取包含 不包含给定字段的 某些值 的所有文档 获取给定字段的值等于 不等于 某个值 的所有文档 根据我的映射 字段是字符串类型 这意味着它们支持关键字和全文搜索 例如 myField type text fields
  • Elasticquent(ElasticSearch) Laravel 限制

    您好 我尝试使用 elasticSearch 查询获取所有结果 但如果 limit 值为 null 则仅返回 10 个结果 videos Video searchByQuery match gt field gt request gt fi
  • Elasticsearch 5.1 完成建议中的输出字段有什么好的替代方案吗?

    在 ES 5 1 中索引数据时遇到的第一个错误是包含输出字段的完成建议映射 message MapperParsingException failed to parse nested IllegalArgumentException unk
  • Elasticsearch 文档的最大大小是多少?

    我读到有关 Lucene 仅限于 2Gb 文档的注释 对于可在 Elasticsearch 中建立索引的文档大小是否有其他限制 Lucene 内部使用字节缓冲区 该缓冲区使用 32 位整数进行寻址 根据定义 这限制了文档的大小 所以理论上2
  • ElasticSearch:从 Painless 脚本中的嵌套字段计算 arcDistance

    我需要计算 Painless 脚本内的弧距 但在这种情况下还没有找到访问 geo API 的方法 即 第一点作为参数传递给脚本 这意味着我只获得原始值 第二点是从嵌套文档中读取的 这意味着我无法使用doc myGeoField value
  • Elasticsearch如何支持涉及多个文档的事务

    我使用elasticsearch和非规范化数据 比如 PUT my index user 1 name John Smith email email protected cdn cgi l email protection dob 1970

随机推荐

  • 架构师成长之路-docker 搭建kibana可视化平台操作es索引

    什么是kibana Kibana 是一款免费开源的前端应用程序 其基础是 Elastic Stack 可以为 Elasticsearch 中索引的数据提供搜索和数据可视化功能 官方术语可以理解操作es的一个可视化工具 es封装了接口 而ki
  • 缺席一年后,谷歌I/O大会回来了!3D视频聊天,10倍性能TPU,还有Android 12重磅登场!...

    新智元报道 来源 Google Blog 编辑 yaxin 好困 新智元导读 5月19日凌晨1点 谷歌IO 2021开发者大会重新回归 谷歌可谓是厚积薄发 积攒2年创新技术轮番轰炸 3D视频聊天Starline 十倍性能TPU V4 聊天不
  • 浅谈小程序开源业务架构建设之路

    一 业务介绍 1 1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态 我们的愿景是 定义移动时代最佳体验 建设智能小程序行业标准 打破孤岛 共建开源 开放 繁荣的小程序行业生态 百度智能小程序的生态玩家有三类 分
  • Java和Python读取文件总结

    public static ArrayList
  • 紫光电子档案管理系统存在SQL注入漏洞(漏洞复现)

    文章目录 紫光电子档案管理系统存在SQL注入漏洞 漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 紫光电子档案管理系统存在SQL注入漏洞
  • VMware如何导出和导入OVF文件

    开源虚拟化格式 OVF文件 是一种开源的文件规范 是一种开源 安全 有效 可拓展的便携式虚拟打包格式 由ovf文件 mf文件 cert文件 vmdk文件和iso文件等组成 可以用于虚拟机在不同虚拟化平台上的迁移 本文介绍VMware如何导出
  • Windows10访问共享总是提示输入网络凭证不正确

    场景 安装了windows10系统后 访问共享时总是提示输入网络凭证 输入什么都提示不正确 被访问机也是windows 10 操作系统 使用windows7不需要输入密码就可以访问 即使在被访问机上增加新的用户或者用guest账号去登录也会
  • GB9706.1-2007名词解释:电压

    电压 1 高电压 任何超过 1000V 交流或 1500V 直流或 1500V 峰值的电压 2 网电源电压 多相供电网中两相线之间的电压 或单相供电网中相线与中性线之间的电压 3 安全特低电压 在用安全特低电压变压器或等效隔离程度的装置与供
  • typora

    关于typora的一篇博客 https blog csdn net mingzhuo 126 article details 79941450
  • faceswap使用记录

    1 没有显示 fs cache文件夹 当时我是使用云gpu来运行文件代码的 里面提示我安装两个配置文件放置到 fs cache文件夹 但是当前文件夹里面并没有显示 fa cache文件夹 虽然不知道是什么原因 但这个文件夹其实是存在的 你下
  • java读取文件的方法是_java读取文件的方法有几种

    java读取文件的方法有几种 发布时间 2020 06 26 14 56 33 来源 亿速云 阅读 104 作者 Leah 这篇文章将为大家详细讲解有关java读取文件的方法 文章内容质量较高 因此小编分享给大家做个参考 希望大家阅读完这篇
  • 【python】Counter 函数的用法

    https docs python org 3 6 library collections html collections Counter 原文链接 https blog csdn net u010339879 article detai
  • 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景

    原文地址 http article ityran com archives 2140 本为由泰然教程组成员 浅底 原创 作为一位经验丰富的游戏开发人员 这次浅底将CocosBuilder经验分享给大家 希望大家喜欢 欢迎拍砖 转载请注明出处
  • yolov5加入CBAM,SE,CA,ECA注意力机制,纯代码(22.3.1还更新)

    本文所涉及到的yolov5网络为5 0版本 后续有需求会更新6 0版本 CBAM注意力 class ChannelAttention nn Module def init self in planes ratio 16 super Chan
  • 答辩准备细节 - 推荐第三本书很棒的书

    之前介绍了 PPT演讲力 重要时刻 不要输在表达上 和 金字塔原理 本次准备来介绍一本非常好的设计书 写给大家看的设计书 01 设计的必要性 写简历 做PPT等都可以用到 我们虽然不是专门的设计人员 但是我们仍然可以追求内容更好看 人们对于
  • XDOJ寻找最长的行

    寻找最长的行 类别 字符串 时间限制 1S 内存限制 1000Kb 问题描述 寻找若干行文本中最长的一行 输入说明 输入为多个字符串 每个字符串长度不超过100个字符 每个字符串占一行 输入的行为 end 时表示输入结束 输出说明 输出其中
  • Elasticsearch 实现分组统计

    之前有个查询es分组求和的需求 类似关系型数据库 select a b sum c from table group by a b 当时用DSL查询语句实现 这边记录下 GET my index my type search from 0
  • C++中new与delete问题学习

    C 中new与delete问题学习 一 new char与delete问题 1 问题程序 include
  • 普歌-云言团队-Spring的AOP简介

    什么是AOP AOP 为 Aspect Oriented Programming 的缩写 意思为面向切面编程 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 AOP 是 OOP 的延续 是软件开发中的一个热点 也是Spri
  • 【ES实战】索引mapping的动态设置

    动态mapping 文章目录 动态mapping 动态mapping规则 语法规则 match mapping type match and unmatch match pattern path match and path unmatch