一起来学ElasticSearch(四)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 一起来学ElasticSearch(四)

前言

目前正在出一个Es专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~


今天是开工的第一天,祝大家开工大吉,承接上文,本节主要给大家介绍一下动态映射,内容不多。好了, 废话不多说直接开整吧~


什么是动态映射

通俗的讲,就是文档中的字段类型可以由ES动态识别,无需在创建索引的时候规定字段的类型。


比如在项目中,如果不确定字段数据类型的情况下,可以使用动态映射,ES可以利用动态映射来决定该字段的类型,并自动把该字段添加到映射中。


在使用的时候要结合实际业务来考虑,如果将 ES 当作主要的数据存储使用,并且希望出现未知字段时抛出异常,那么开启动态 mapping 并不适用。


***在不确定索引类型字段时,可以先创建临时索引,然后存储数据,查询映射。再删除临时索引。这样就得到数据的基本映射了,可以在其上做精细化修改。 ***


映射规则

  • null  没有字段被添加
  • true or false boolean 类型
  • 浮点类型数字 float 类型
  • 数字 long 类型
  • JSON 对象 object 类型
  • 数组 由数组中第一个非空值决定
  • string 有可能是 date 类型(若开启日期检测)、double 或 long 类型、text 类型、keyword 类型


在 mapping 中可以通过 dynamic 设置来控制是否自动新增字段,接受以下参数:

  • true:默认值为 true,自动添加字段。
  • false:忽略新的字段。
  • strict:严格模式,发现新的字段抛出异常。


日期规则

es中当字符串的格式为:yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z时,es动态模板会自动认为该字符串为日志类型


  • 可以通过date_detection来关闭日期模板匹配


  • 可以通过dynamic_date_formats来指定日期字符匹配模板


PUT my_index
{
"mappings": {
  "dynamic_date_formats": ["MM/dd/yyyy"]
}
}
复制代码


数字检测

动态映射有时会将数字映射为字符串类型,可以通过开启数字检测来解决该问题

PUT my_index
{
"mappings": {
  "numeric_detection": true
}
}
复制代码


动态映射模板

定义动态映射模板,来格式化动态映射的规则,动态映射模板包含以下关键字:

  • match_mapping_type:用来匹配当前映射的字段类型。可以理解为,当字段类型为match_mapping_type时


  • match、unmatch 、match_pattern:用来匹配当前映射字段的名称。可以理解为,当字段名称匹配match、match_pattern时,当字段名称不匹配unmatch


  • path_match、path_unmatch:用来匹配当前映射字段的路径,通常用来匹配嵌套字段。可以理解为,当字段路径为path_match时,当字段路径不匹配
  • path_unmatch


  • {name}, {dynamic_type} :用来进行占位符匹配,具体怎么用,都可以,但是最终映射的值为name或动态类型 当然也可以直接强制指定类型和属性


下面看一些示例:


match_mapping_type

dynamic_templates是动态模板名称,什么字段都可以。integersstrings时动态模板项名称

PUT my_index
{
"mappings": {
 "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
           }
         }
       }
     }
   }
 ]
}
}
复制代码


match、unmatch

PUT my_index
{
"mappings": {
 "dynamic_templates": [
   {
     "longs_as_strings": {
       "match":   "long_*",
       "unmatch": "*_text",
       "mapping": {
         "type": "long"
       }
     }
   }
 ]
}
}
复制代码


match_pattern

{
"mappings": {
 "dynamic_templates": [
   {
     "longs_as_strings": {
       "match_pattern": "regex",  
       "match": "^profit_\d+$",
       "unmatch": "*_text",
       "mapping": {
         "type": "long"
       }
     }
   }
 ]
}
}
复制代码


path_match、path_unmatch

{ 
    "mappings": { 
        "dynamic_templates": [ 
            {
                "full_name": {
                    "path_match": "name.*",
                    "path_unmatch": "*.middle",
                    "mapping": {
                        "type": "text",
                        "copy_to": "full_name"
                    }
                }
            } 
        ] 
    } 
}
复制代码


{name}、{dynamic_type}

{
  "mappings": {
    "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
          }
        }
      }
    ]
  }
}
复制代码


直接指定类型

{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}
复制代码


索引模板

索引模板的作用是提前创建好模板,后续索引的创建会根据匹配规则,自动生成该索引的配置

  • 模板只在索引创建时起作用,修改模板不会影响已创建的索引。
  • 可以设置多个索引模板,这些设置会被 merge 在一起。
  • 可以设置 order 的数值,控制 merge 的过程。

当一个索引被创建时,如果符合多个模板,那么模板之间merge符合以下规则:

  • order 值高的模板会覆盖 order 值低的模板。
  • 相同字段会覆盖
  • 不同字段会叠加

感兴趣的同学,可以自行去查询相关文档,这个不是很常用


结束语

本节主要讲了ES中的动态mapping概念以及它的相关属性。下节给大家讲ES中文档相关的API操作

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
5月前
|
机器学习/深度学习 算法 数据可视化
混合效应模型原理与实现:从理论到代码的完整解析
混合效应模型并非神秘的技术,而是普通回归方法在层次化结构建模方面的原理性扩展。这种理解将成为机器学习工具箱中下一个技术突破的重要基础。
380 1
混合效应模型原理与实现:从理论到代码的完整解析
|
7月前
|
机器学习/深度学习 人工智能 编解码
告别潜在空间的黑箱操作,直接在原始像素空间建模!PixelFlow:港大团队开源像素级文生图模型
香港大学与Adobe联合研发的PixelFlow模型,通过流匹配和多尺度生成技术实现像素级图像生成,在256×256分辨率任务中取得1.98的FID分数,支持端到端训练并突破传统模型对预训练VAE的依赖。
339 36
告别潜在空间的黑箱操作,直接在原始像素空间建模!PixelFlow:港大团队开源像素级文生图模型
|
存储 编译器 C++
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
306 0
|
C++ iOS开发
02 C++ - 开发环境下载与安装(CLion)
02 C++ - 开发环境下载与安装(CLion)
377 0
|
大数据 编译器 Anolis
龙蜥解锁倚天底层算力,加速数据智能化关键技术落地
龙蜥+倚天软硬件结合,加速企业数据智能底层算力关键技术,以及倚天 ECS 产品大规模落地实践等内容。
|
存储 安全 Java
Java并发基础:PriorityBlockingQueue全面解析!
PriorityBlockingQueue类能高效处理优先级任务,确保高优先级任务优先执行,它内部基于优先级堆实现,保证了元素的有序性,同时,作为BlockingQueue接口的实现,它提供了线程安全的队列操作,适用于多线程环境下的任务调度与资源管理,简洁而强大的API使得开发者能轻松应对复杂的并发场景。
470 3
Java并发基础:PriorityBlockingQueue全面解析!
|
域名解析 监控 Linux
排查网络-几个步骤 几款工具
先抛个问题,如果哪天突然发现IDC机房 和 公有云 之间的服务无法访问了(排除服务本身的问题之外,可能是网络不通,也可能是网络变的很慢使得资源无法及时下载,从而导致服务无法访问)。
|
存储 Java UED
如何在Flask应用中实现异步编程?
【2月更文挑战第27天】【2月更文挑战第96篇】如何在Flask应用中实现异步编程?
569 0
|
存储 BI Apache
下一代实时数据库:Apache Doris 【七】数据模型
下一代实时数据库:Apache Doris 【七】数据模型
407 1