ElasticSearch-倒排索引 文档映射

news2024/9/21 18:32:26
  • 倒排索引
  • 文档映射
    • 已有字段的Mapping修改
    • 常用Mapping参数配置
    • Index Template
    • Dynamic Template

倒排索引

  • 当数据写入 ES 时,数据将会通过 分词 被切分为不同的 term,ES 将 term 与其对应的文档列表建立一种映射关系,这种结构就是 倒排索引

    • 倒排索引
  • 为了进一步提升索引的效率,ES 在 term 的基础上利用 term 的前缀或者后缀构建了 term index, 用于对 term 本身进行索引

    • 倒排索引
  • 当我们去搜索某个关键词时,ES 首先根据它的前缀或者后缀迅速缩小关键词的在 term dictionary 中的范围,大大减少了磁盘IO的次数

    • 单词词典(Term Dictionary) :记录所有文档的单词,记录单词到倒排列表的关联关系
    • 倒排列表(Posting List):记录了单词对应的文档结合,由倒排索引项组成
    • 倒排索引项(Posting):
      • 文档ID
      • 词频TF:该单词在文档中出现的次数,用于相关性评分
      • 位置 (Position):单词在文档中分词的位置。用于短语搜索(match phrase query)
      • 偏移 (Offset):记录单词的开始结束位置,实现高亮显示
  • Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引

  • 可以指定对某些字段不做索引

    • 优点︰节省存储空间
    • 缺点: 字段无法被搜索

文档映射

  • Mapping类似数据库中的schema的定义,作用如下
    • 定义索引中的字段的名称
    • 定义字段的数据类型,例如字符串,数字,布尔等
    • 字段,倒排索引的相关配置 (Analyzer)
  • ES中Mapping映射可以分为动态映射和静态映射
    • 动态映射:不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射

      • 动态映射(Dynamic Mapping)的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型
      • 但是有时候会推算的不对,例如地理位置信息
      • 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
      • 文档映射
    • 静态映射:事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射

已有字段的Mapping修改

  • 后期更改Mapping的字段类型
    • 新增加字段

      • dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
      • dynamic设为false,Mapping 不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
      • dynamic设置成strict (严格控制策略),文档写入失败,抛出异常
      • Mapping修改
    • 对已有字段,一旦已经有数据写入,就不再支持修改字段定义

      • Lucene 实现的倒排索引,一旦生成后,就不允许修改
      • 如果希望改变字段类型,可以利用 reindex API,重建索引
    • 原因

      • 如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
      • 但是如果是增加新的字段,就不会有这样的影响
  • 对已有字段的mapping修改:实现索引的平滑过渡,并且是零停机
    • 如果要推倒现有的映射, 你得重新建立一个静态索引
    • 然后把之前索引里的数据导入到新的索引里 POST _reindex
    • 删除原创建的索引
    • 为新索引起个别名, 为原索引名 PUT /user2/_alias/user
PUT /user2
{"mappings":{
   "properties":{"name":{"type":"text"}}}}
POST _reindex
{"source":{"index":"user"},
 "dest":{"index":"user2"}}
DELETE /user
PUT /user2/_alias/user

常用Mapping参数配置

  • index: 控制当前字段是否被索引,默认为true
    • 如果设置为false,该字段不可被搜索
PUT /user
{"mappings": {
  "properties": {
   "name":{"type":"text","index":false}}}}
  • 有四种不同基本的index options配置,控制倒排索引记录的内容
    • docs : 记录doc id
    • freqs:记录doc id 和term frequencies(词频)
    • positions: 记录doc id / term frequencies / term position
    • offsets: doc id / term frequencies / term posistion / character offsets
  • text 类型默认记录 postions,其他默认为 docs
    • 记录内容越多,占用存储空间越大
PUT /user
{"mappings":{
  "properties": {
   "name":{"type":"text","index_options":"offsets"}}}}
  • null_value: 需要对Null值进行搜索,只有keyword类型支持设计Null_Value才行
PUT /user
{"mappings":{
  "properties": {
   "name":{"type":"keyword","null_value":"NULL"}}}}
  • copy_to设置:将字段的数值拷贝到目标字段,满足一些特定的搜索需求
    • copy_to的目标字段不出现在_source中
PUT /user
{"mappings":{
  "properties":{
   "name":{"type":"text","copy_to":"full_address"}}}}

Index Template

  • Index Templates可以帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到新创建的索引之上
    • 模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引
    • 你可以设定多个索引模版,这些设置会被“merge”在一起
    • 你可以指定“order”的数值,控制“merging”的过程
  • 当一个索引被新创建时
    • 应用Elasticsearch 默认的settings 和mappings
    • 应用order数值低的lndex Template 中的设定
    • 应用order高的 Index Template 中的设定,之前的设定会被覆盖
    • 应用创建索引时,用户所指定的Settings和 Mappings,并覆盖之前模版中的设定
PUT /_template/template_default 
{"index_patterns": ["*"],
 "order": 0,
 "version": 1, 
 "settings": { 
   "number_of_shards":1,
   "number_of_replicas":1}}

Dynamic Template

  • Dynamic Tempate定义在某个索引的Mapping中
PUT my_index
{"mappings":{
  "dynamic_templates":[{
   "strings_as_boolean":{
   "match_mapping_type":"string", 
   "match":"is*",
   "mapping":{"type":"boolean"}}}]}}

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

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

相关文章

火车票、高铁票如何开具电子发票?12306怎么查询报销凭证是否领取?

火车票、高铁票如何开具电子发票? 众所周知,目前很多消费(衣食住行)报销都是可以开具电子发票的,但火车票目前无法开具电子发票。 火车票目前只有纸质报销凭证,报销凭证与之前的车票类似,但是…

数学建模常用工具总结

数学建模常用工具总结 绘图篇pythonMATLABLIVEGAP CHARTSApache EChartsBioLadderHiplot Pro 生物医学可视化平台Graph EditorRAWGraphs 2.0ExcalidrawPPT绘图 配色篇Color SpaceAdobe Color 素材篇手绘素材插画网iconfont-阿里巴巴矢量图标库下面四个都是实物风格的素材&#…

40天的八股文总结

四十天前报名参加了卡哥的八股文训练营,在这四十天中每周都在训练营中打卡,可以通过念出来的方式进行八股文的记忆,同时还可以听到其他训练营中的朋友们的打卡,这让人感觉非常的有动力,每天都有更强烈的记忆八股文的信…

安装win7鼠标键盘不能动原因分析及解决办法

有同学反馈安装win7鼠标键盘不能动这是怎么回事?后来研究该问题主要是原版win7没有集成usb3.0和usb3.1驱动导致,下面小编就教大家安装win7鼠标键盘不能动原因分析及解决方法。 安装win7鼠标键盘不能动原因分析: 原因:研究后发现是…

Quartz.Net_快速开始

简述 Quartz中主要分为三部分,JobDetail、Trigger、Scheduler,分别是任务、触发器、调度器,三者的关系为:Trigger控制JobDetail的执行时间和频率,而Scheduler负责将具体的Trigger与具体的JobDetail绑定 1.安装Quartz…

无需后端也能测试 CRUD:Mock.js 的强大功能

前言 在前端开发中,数据的增删改查(CRUD)操作是最常见的需求之一。 然而,在后端接口尚未就绪的情况下,前端开发者往往需要一种方法来模拟这些操作。 Mock.js 作为一个强大的前端数据模拟库,可以帮助开发…

Ubuntu 上启用 swap 内存,提高运行效率!

Ubuntu 24.04 是一个功能强大的操作系统,但有时你的电脑可能会在运行多个应用程序时耗尽内存。这会降低系统的运行速度和效率。在这种情况下,添加交换内存会有所帮助。交换内存作为一个额外的内存资源,您的计算机可以顺利处理更多的任务。 在…

如何用一次推送,毁掉一个公司?

极狐GitLab 是 GitLab 在中国的发行版,可以私有化部署,对中文的支持非常友好,是专为中国程序员和企业推出的企业级一体化 DevOps 平台,一键就能安装成功。安装详情可以查看官网指南。 本文分享如何使用极狐GitLab 17.2 发布的密钥…

这样的配置,才够格做“黑悟空”“天命人”

《黑神话:悟空》取材自中国古典名著《西游记》,玩家将扮演齐天大圣孙悟空,体验一段惊心动魄的冒险旅程,被媒体誉为中国首款“3A游戏”。 在《黑神话:悟空》发布并风靡全球之际,唯迈医疗的 Phoenix 210 亦同…

【渗透工具箱】灵兔宝盒-Rabbit_Treasure_Box_V1.0.1

Rabbit_Treasure_Box_V1.0.1 是一款基于Windows操作系统的渗透工具箱,旨在提供一个开箱即用的渗透测试工具集合。该工具箱通过 Dawn Launcher 进行管理,支持一键备份和更新。它包含了脚本类工具,在Windows中启动,集成了在线安全工…

Debug-026-el-upload照片上传-编辑页回显照片并且支持再上传的实现方案

前言: 在之前写的一篇文章《Debug-022-el-upload照片上传-整体实现回顾》中回顾了整体的借助el-upload实现了照片上传的功能。现在业务中增加了一项需求,我们的表单一般是分为“新增页”和“编辑页”的,这里新需求希望可以在编辑页中实现对“…

Java项目: 基于SpringBoot+mysql大学生入学审核系统(含源码+数据库+开题报告+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql大学生入学审核系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

PAT (Advanced Level) Practice——1008,1009

1008: 难度:简单 题意: 我们城市最高的建筑只有一部电梯。N个数字表示电梯将按指定顺序停在哪些楼层。电梯上一层需要 6 秒,下一层需要 4 秒。电梯将在每个站点停留 5 秒。对于给定的N个数字,您将计算完成这些请求所…

前后端分离项目遇到的跨域问题解决方案(后端为主)

文章目录 什么是跨域问题?第一种方式 ⇒ 注解解决方案:第二种方式 ⇒ 使用 CorsFilter 方法解决:第三种方式 ⇒ 实现 WebMvcConfigure 接口,添加映射(个人推荐) 什么是跨域问题? 先说问题&#…

【软件流程】项目开发管理制度(Doc文件)

项目开发管理总体流程 一、总则 二、阶段成果 三、岗位设置 四、项目立项 五、项目计划与监控 六、需求分析 七、总体设计 八、详细设计 九、项目实现 十、项目测试 十一、用户培训 十二、系统上线 十三、系统验收 十四、产品维护 十五、源码和文档 十六、质量检…

Gitee镜像关联GitHub仓库

申请 GitHub 私人令牌 GitHub 私人令牌用于授予 Gitee 读写 Github 仓库的权限。 1)登录GitHub,通过 个人头像 > Settings > 下拉左侧菜单栏进入 Developer settings。 2)Personal access tokens > Tokens(classic) > Generate …

[数据集][目标检测]街道乱堆垃圾检测数据集VOC+YOLO格式94张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):94 标注数量(xml文件个数):94 标注数量(txt文件个数):94 标注类别数…

Spring Security 原理、源码解析及进阶

文章目录 参考文献 1、信息安全基础1. CIA 三要素2. Authentication Vs. Authorization3. RBAC模型 2、Spring Security1. Spring Security 简介2. Spring Security 架构核心2.1 FilterChain (Servlet)2.2 [DelegatingFilterProxy](https://docs.spring.io/spring-security/ref…

基于DPU与SmartNIC的K8s Service解决方案

1. 方案背景 1.1. Kubernetes Service介绍 Kubernetes Service是Kubernetes中的一个核心概念,它定义了一种抽象,用于表示一组提供相同功能的Pods(容器组)的逻辑集合,并提供了一种方式让这些Pods能够被系统内的其他组…

5、Django Admin后台移除“删除所选”操作

默认情况下,Django Admin后台的listview模型列表页,会有一个Delete Selected删除所选操作。假设你需要再从Hero管理模型中移除该删除操作。 ModelAdmin.get_actions方法可以返回所有的操作方法。通过覆盖此方法,移除其中delete_selected方法…