当前位置: 首页 > news >正文

elasticsearch列一:索引模板的使用

概述

近期一直在负责es这块,就想着和大家分享一些使用经验,我们从存储、查询、优化、备份、运维等几个方面来做分享。今天咱们先看下如何更加合理的存储数据。

初见索引模板

记得刚接触es还是18年那会,项目上线后因一些原因导致日志这部分的开发未完成,导致日志这块只能通过linux命令查询,及其不方便。

于是老大让我自己搞定这块,当时是由兄弟团队负责开发这块,所以我们的日志都只是写到了日志文件上,项目刚上线各种问题还经常需要通过日志查询,瞬间涌上心头,于是先搞个脚本把各个服务日志定时搜集到一台服务器上,避免丢失。

接下来一路趟坑便就开始了,为了快速搞起来,优先百度各种方案,提到最多的就是elk这个词,于是按照网上的方案快速搭建起来了。

但是那会只是换了方式查询,通过kibana各种维度查询,语法边百度边查询,随着时间推移日志量越来越大,慢慢的查询性能大大降低,一但出了事自己也不知道怎么运维es。

于是痛下决心开始学习官网文档,全方位了解es。首先发现存储就不对,各个字段几乎都是text格式,大大浪费了磁盘空间。于是首个模板就这么出来了。我们展示其中一段:

"properties":{                "id":{                    "type":"keyword"                },                "relativeJobId":{                    "type":"keyword"                },                "reqDate":{                    "type":  "date",                    "format": "yyyy-MM-dd HH:mm:ss"                },                "operDate":{                    "type":"date",                    "format": "yyyy-MM-dd HH:mm:ss"                },                "title":{                    "type":"text",                    "norms": false                }            }

建立好模板后再晚上业务低峰期对索引逐个进行reindex操作后发现查询能力大大提升,磁盘空间也下降很多。

索引升级

但是运行一段时间后问题出来了,我们需要扩展日志字段,并且是精确匹配,那该怎么办呢?我们可以通过动态模板的方式实现,我们看下索引模板变成了这样:

"properties":{                "id":{                    "type":"keyword"                },                "relativeJobId":{                    "type":"keyword"                },                "reqDate":{                    "type":  "date",                    "format": "yyyy-MM-dd HH:mm:ss"                },                "operDate":{                    "type":"date",                    "format": "yyyy-MM-dd HH:mm:ss"                },                "title":{                    "type":"text",                    "norms": false                }            },            "dynamic_templates": [                {                    "longs": {                        "match_mapping_type": "long",                        "mapping": {                            "type": "long"                        }                    }                },                {                    "boolean": {                        "match_mapping_type": "boolean",                        "mapping": {                            "type": "boolean"                        }                    }                },                {                    "strings_as_keywords": {                        "match_mapping_type": "string",                        "mapping": {                            "type":  "keyword"                        }                    }                },{                    "date": {                        "match_mapping_type": "date",                        "mapping": {                            "type":  "date",                            "format": "yyyy-MM-dd HH:mm:ss"                        }                    }                }            ]        }

这样一来如果新增的字段是String类型,es就会采用keyword的方式进行存储,如果是时间字段就会按照这种格式存储等等。

看似一切都解决了,但是运行一段时间后发现我们又需要增加支持模糊查询的字段,这又改怎么办呢?于是我们的索引模板就发展成了这样:​​​​​​​

"properties":{                "id":{                    "type":"keyword"                },                "relativeJobId":{                    "type":"keyword"                },                "reqDate":{                    "type":  "date",                    "format": "yyyy-MM-dd HH:mm:ss"                },                "operDate":{                    "type":"date",                    "format": "yyyy-MM-dd HH:mm:ss"                },                "title":{                    "type":"text",                    "norms": false                }            },            "dynamic_templates": [                {                    "longs": {                        "match_mapping_type": "long",                        "mapping": {                            "type": "long"                        }                    }                },                {                    "boolean": {                        "match_mapping_type": "boolean",                        "mapping": {                            "type": "boolean"                        }                    }                },                {                    "strings_as_text": {                        "match_mapping_type": "string",                        "match":   "text_*",                        "mapping": {                            "type":  "text",                            "norms": false                        }                    }                },                {                    "strings_as_keywords": {                        "match_mapping_type": "string",                        "mapping": {                            "type":  "keyword"                        }                    }                },{                    "date": {                        "match_mapping_type": "date",                        "mapping": {                            "type":  "date",                            "format": "yyyy-MM-dd HH:mm:ss"                        }                    }                }            ]        }

如果是test—开头的字段并且是String类型,es就会采用text的方式进行存储,我们可以看到有个norms的属性,我们设置了false,它是啥意思呢?我们细心点可以发现通过query查询的时候你会发现结果集中每条数据都有会有个相关度分数,这个不仅会消耗cpu还会占用一定的磁盘性能,如果我们不需要根据相关度分数进行高亮或者排序之类的,完全可以把这部分给屏蔽掉,节省磁盘空间。

其实我们还可以通过ignore_above的方式设置字段一旦超过多大后就不再支持搜索,比如你的字段是一段1mb的String字符串用它来做匹配就太过消耗性能了(单说filter查询时会通过bitset缓存,此项就会大大降低性能。),完全可以通过其附属字段进行匹配。

通过上述模板升级后,我们的模板就已经足够支持各种变化了,也就不用担心动态增加字段的问题了

总结

要想深入了解一个技术还是官方文档啊,毕竟只有官方最了解自己的产品。希望接下来一段时间我们一起跟着官方文档深入学习es。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity 如何打造”大厅+子游戏”架构
  • SpringBoot + MyBatis-Plus 实现分页操作详解
  • 边缘计算网关在温室大棚智能控制系统应用,开启农业新篇章
  • gnu工程的编译 - 以libiconv为例
  • “a == b”和“a.equals(b)”有什么区别?
  • 谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题
  • 2024年软件测试行业展望
  • 什么是负载均衡?
  • Frappe Charts:数据可视化的强大工具
  • 如何在 Ubuntu 16.04 上使用 Minio 设置对象存储服务器
  • 鸿蒙 DevEco Studio 3.1 入门指南
  • js遍历后端返回的集合将条件相同的放入同一个数组内
  • Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)
  • 约翰瑟尔的故事
  • QT上位机开发(抽奖软件)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2017-09-12 前端日报
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HTTP--网络协议分层,http历史(二)
  • iOS | NSProxy
  • Java 23种设计模式 之单例模式 7种实现方式
  • Leetcode 27 Remove Element
  • Mocha测试初探
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • sublime配置文件
  • Vue 动态创建 component
  • 人脸识别最新开发经验demo
  • 如何用vue打造一个移动端音乐播放器
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 移动端 h5开发相关内容总结(三)
  • Prometheus VS InfluxDB
  • ​flutter 代码混淆
  • #HarmonyOS:Web组件的使用
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (55)MOS管专题--->(10)MOS管的封装
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)Android布局类型(线性布局LinearLayout)
  • (循环依赖问题)学习spring的第九天
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET6 命令行启动及发布单个Exe文件
  • .NET8使用VS2022打包Docker镜像
  • .NET分布式缓存Memcached从入门到实战
  • .Net接口调试与案例
  • .NET业务框架的构建
  • /proc/vmstat 详解
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解