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。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java servlet软件缺陷库管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet软件缺陷库管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean(mvc模式),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOM…

LINUX 抓包工具Tcpdump离线安装教程

本次教程基于内网环境无法访问网络使用安装包进行安装抓包工具 1、首先给大家看下一共有6个安装包,依次进行解压,包我就放到csdn上了,需要的可以联系我进行下载 2打包然后传到服务器任意一个目录下,进入到当前目录,然后…

基于ssm的教师办公管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本教师办公管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

数据结构: 位图

位图 概念 用一个bit为来标识数据在不在 功能 节省空间快速查找一个数在不在一个集合中排序 去重求两个集合的交集,并集操作系统中的磁盘标记 简单实现 1.设计思想:一个bit位标识一个数据, 使用char(8bit位)集合来模拟 2.预备工作:a.计算这个数在第几个char b.是这个ch…

EasyExcel详解(结合官方文档)

EasyExcel 零、前言 文章是根据官方文档&#xff0c;加上自己的测试运行总结出来的&#xff0c;目前只总结的EasyExcel读的部分&#xff0c;写的部分还未完结&#xff0c;后续会更新1、官方文档 https://easyexcel.opensource.alibaba.com/2、EasyExcel的maven依赖 <!--…

利用ufun对部件进行操作(新建、打开、保存、另存、关闭等)

一、概述 在NX二次开发中我们常常会用到新建、打开、保存、另存为和关闭命令&#xff0c;这些函数一般放在UF_part.h头文件下&#xff0c;下面针对以上有关功能结合案例进行说明。 二、功能函数结合案例说明 2.1新建文件创建块保存功能 1&#xff09;NXOpenC代码 #include …

DNS域名查询过程

目录 DNS&#xff08;Domain Names System&#xff09; 域名转IP IP转域名 域名 域名查询流程 浏览器DNS缓存 操作系统缓存 本地host文件 完整流程 递归查询 迭代查询 DNS&#xff08;Domain Names System&#xff09; 域名系统&#xff0c;将域名和 IP 地址进行转…

Python中如何使用_new_实现单例模式

单例模式是一个经典设计模式&#xff0c;简要的说&#xff0c;一个类的单例模式就是它只能被实例化一次&#xff0c;实例变量在第一次实例化时就已经固定。 在Python中常见的单例模式有None&#xff0c;这就是一个很典型的设计&#xff0c;通常使用 if xxx is None或者if xxx …

学习路径概览

根据codewave 低代码官方的资料&#xff0c;我们以一个简单的初级采购管理系统为例&#xff0c;带大家进行学习。学习的案例框架如下&#xff1a; https://ik4mh7u2np.feishu.cn/docx/NjyEd9qD5oElkoxJhapc3fV4nPe?fromfrom_copylink​​​​​​​ 主要分为以下四个学习模块

数组(定义,静态初始化,地址值,元素访问,索引,遍历,动态初始化,两种初始化的区别,练习)

文章目录 1.数组概念&#xff1a; 2.数组的定义格式一&#xff1a;格式二&#xff1a;详解&#xff1a;注意点&#xff1a; 3.数组的静态初始化完整格式&#xff1a;格式详解&#xff1a;注意点&#xff1a;简化格式:练习1&#xff1a;练习2&#xff1a;练习3&#xff1a; 4.地…

uniapp二维码有效期倒计时三分钟的效果是实现

需求&#xff1a; 会员码时效只有3分钟有效期&#xff0c;需要在页面倒计时3分钟&#xff0c;没有长按保存的效果实现 效果&#xff1a; 代码&#xff1a; <templete> <view> <uni-list> <view class"custom-list-item" click"onCode(c…

音视频基本概念

多线程好处 充分利用cpu资源的工具 多线程带来的问题 多线程管理问题 线程的互斥与同步 互斥 资源 有限多个人去抢 同步 有序进行 锁的种类 读写锁 读写分离 自旋锁 等待资源释放&#xff08;例如&#xff09; 可重入锁 SDL锁 互斥锁 SDL_CreateMutex/SDL_Destro…