当前位置:首页 > 科技  > 软件

Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程

来源: 责编: 时间:2024-01-04 09:33:25 362观看
导读1、引言在 Elasticsearch 中,可以使用 Painless 脚本来实现一些非标准的处理结果。这些脚本可以直接嵌入到数据处理管道中,但为了使脚本与管道相互独立,还可以将脚本单独存储在 Elasticsearch 中,并在数据摄取管道(Ingest

1、引言

在 Elasticsearch 中,可以使用 Painless 脚本来实现一些非标准的处理结果。这些脚本可以直接嵌入到数据处理管道中,但为了使脚本与管道相互独立,还可以将脚本单独存储在 Elasticsearch 中,并在数据摄取管道(Ingest pipeline)中按需调用它们。TpI28资讯网——每日最新资讯28at.com

这种存储脚本的方式,咱们之前也有过介绍,Elasticsearch 中有个专有术语名词与之对应,叫:stored script 存储脚本。通过 stored script 方式,可以在不同的地方重复使用同一段脚本,而无需复制代码。TpI28资讯网——每日最新资讯28at.com

在Elasticsearch中使用 stored script 存储脚本是一种高效且灵活的方法,特别适用于那些需要在多个数据处理场景中重复使用相同逻辑的场合。通过这种方式,可以构建更加模块化、易于管理的数据处理管道。TpI28资讯网——每日最新资讯28at.com

2、Base64 解码的存储脚本实现

如下脚本的目的是将源数据中的字段从Base64格式转换为解码后的文本。TpI28资讯网——每日最新资讯28at.com

2.1 创建 Base64 解码脚本

PUT /_scripts/decodebase64{  "script": {    "description": "Decode base64",    "lang": "painless",    "source": "def src=ctx[params['field']]; if (src == null) { return; } def target=params['target_field']; ctx[target]=src.decodeBase64();"  }}

脚本解读如下:TpI28资讯网——每日最新资讯28at.com

  • PUT /_scripts/decodebase64: 这部分指示Elasticsearch创建或更新一个名为decodebase64的脚本。
  • "script": 脚本的主体部分。
  • "description": 脚本的描述,说明了脚本的作用,即解码Base64。
  • "lang": 脚本的编写语言,这里使用的是Elasticsearch的Painless脚本语言。
  • "source": 脚本的具体内容。这个脚本接受一个字段名作为输入(params['field']),检查是否为空,如果不为空,则将其Base64解码并存储在指定的目标字段(params['target_field'])。

这个脚本可以在Elasticsearch的摄取管道中使用,用于在数据索引之前动态地对字段进行Base64解码。TpI28资讯网——每日最新资讯28at.com

2.2 获取存储脚本

如下脚本仅验证,实战中可忽略。TpI28资讯网——每日最新资讯28at.com

GET /_scripts/decodebase64

召回结果如下:TpI28资讯网——每日最新资讯28at.com

{  "_id": "decodebase64",  "found": true,  "script": {    "lang": "painless",    "source": "def src=ctx[params['field']]; if (src == null) { return; } def target=params['target_field']; ctx[target]=src.decodeBase64();"  }}

注意:之前咱们很少这么用。看细节,上面的召回结果有  "_id": "decodebase64", 你关注一下,一会就能用到!TpI28资讯网——每日最新资讯28at.com

2.3 创建使用Base64 解码存储脚本的管道

PUT /_ingest/pipeline/decodebase64{  "description": "Decode hash values",  "processors": [    {      "script": {        "id": "decodebase64",        "params": {          "field": "name_base64",          "target_field": "name"        }      }    }  ]}

上述代码创建了一个名为 decodebase64 的 Elasticsearch 摄取管道,其功能是使用存储的脚本 decodebase64 将字段 name_base64 中的 Base64 编码值解码,并将解码后的文本存储到 name 字段中。TpI28资讯网——每日最新资讯28at.com

和咱们之前讲的不同的地方、灵活的地方在于:field 和 target_field 变成了变量了,可以灵活按照项目需求替换之。TpI28资讯网——每日最新资讯28at.com

2.4 批量写入数据的时候同时指定 pipeline

POST /fruits/_bulk?pipeline=decodebase64{"index":{"_id":"1"}}{"name_base64":"QXBwbGU="}{"index":{"_id":"2"}}{"name_base64":"QW5hbmFz"}{"index":{"_id":"3"}}{"name_base64":"Q2hlcnJ5"}

如上 bulk 批量写入的时候指定 pipeline 的方式,咱们之前也少有讲解。TpI28资讯网——每日最新资讯28at.com

GET fruits/_search

结果如下图所示:TpI28资讯网——每日最新资讯28at.com

图片图片TpI28资讯网——每日最新资讯28at.com

我们清晰的看到,咱们写入的 name_base64 字段借助我们创建的管道、基于存储脚本解码为 name字段值。TpI28资讯网——每日最新资讯28at.com

不着急下结论,咱们再看一组例子。TpI28资讯网——每日最新资讯28at.com

3、16进制解码的存储脚本实现

步骤参见第2部分,咱们只讲重点。TpI28资讯网——每日最新资讯28at.com

3.1 创建16进制解码存储脚本

如下存储脚本的目的:在Elasticsearch中创建并存储一个名为decodehex的脚本,该脚本用于将HEX(十六进制)编码的字符串转换为普通文本。TpI28资讯网——每日最新资讯28at.com

PUT /_scripts/decodehex{  "script": {    "description": "Decode HEX",    "lang": "painless",    "source": "def src=ctx[params['field']]; if (src == null) { return; } def target=params['target_field']; StringBuilder sb = new StringBuilder(); for (int i = 0; i < src.length(); i += 2) { String byteStr = src.substring(i, i + 2); char byteChar = (char) Integer.parseInt(byteStr, 16); sb.append(byteChar) } ctx[target] = sb.toString();"  }}

脚本解读如下:TpI28资讯网——每日最新资讯28at.com

  • PUT /_scripts/decodehex: 这部分指示Elasticsearch创建或更新一个名为decodehex的脚本。
  • script: 脚本的主体部分。
  • description: 脚本的描述,说明了脚本的作用,即解码HEX字符串。
  • lang: 脚本的编写语言,这里使用的是Elasticsearch的Painless脚本语言。
  • source: 脚本的具体内容。这个脚本接受一个字段名作为输入(params['field']),检查是否为空,如果不为空,则将其HEX编码的内容转换为普通文本并存储在指定的目标字段(params['target_field'])。

如上脚本可以在Elasticsearch的摄取管道中使用,用于在数据索引之前动态地对字段进行 HEX 解码。TpI28资讯网——每日最新资讯28at.com

3.2 获取16进制解码存储脚本

如下脚本仅验证,实战中可忽略。TpI28资讯网——每日最新资讯28at.com

GET /_scripts/decodehex

召回结果如下:TpI28资讯网——每日最新资讯28at.com

图片图片TpI28资讯网——每日最新资讯28at.com

3.3 创建使用16进制解码脚本的管道

PUT /_ingest/pipeline/decodehex{  "description": "Decode hash values",  "processors": [    {      "script": {        "id": "decodehex",        "params": {          "field": "color_hex",          "target_field": "color"        }      }    }  ]}

该管道的功能是使用存储的脚本 decodehex 来处理数据:它会取 color_hex 字段中的HEX(十六进制)编码字符串,将其解码成普通文本,并将解码后的结果存储到 color 字段中。这个过程主要用于在将数据索引到 Elasticsearch 之前自动进行数据转换和预处理。TpI28资讯网——每日最新资讯28at.com

同样,灵活的地方在于:field、target_field 是变量。TpI28资讯网——每日最新资讯28at.com

3.4 批量写入数据的时候同时指定 pipeline

POST /fruits_ext/_bulk?pipeline=decodehex{"index":{"_id":"1"}}{"color_hex":"477265656e"}{"index":{"_id":"2"}}{"color_hex":"59656c6c6f77"}{"index":{"_id":"3"}}{"color_hex":"526564"}

如上 bulk 批量写入的时候指定 pipeline 的方式,咱们之前也少有讲解。TpI28资讯网——每日最新资讯28at.com

GET fruits_ext/_search

结果如下图所示:TpI28资讯网——每日最新资讯28at.com

图片图片TpI28资讯网——每日最新资讯28at.com

当然,第2部分、第3部分的存储脚本使用可以灵活的整合为一部分,如下所示。TpI28资讯网——每日最新资讯28at.com

PUT /_ingest/pipeline/decodehashes{  "description": "Decode hash values",  "processors": [    {      "script": {        "id": "decodebase64",        "params": {          "field": "name_base64",          "target_field": "name"        }      }    },    {      "script": {        "id": "decodehex",        "params": {          "field": "color_hex",          "target_field": "color"        }      }    }  ]}

批量构建数据结果:TpI28资讯网——每日最新资讯28at.com

POST /fruits_all/_bulk?pipeline=decodehashes{"index":{"_id":"1"}}{"name_base64":"QXBwbGU=","color_hex":"477265656e"}{"index":{"_id":"2"}}{"name_base64":"QW5hbmFz","color_hex":"59656c6c6f77"}{"index":{"_id":"3"}}{"name_base64":"Q2hlcnJ5","color_hex":"526564"}

执行检索效果:TpI28资讯网——每日最新资讯28at.com

图片图片TpI28资讯网——每日最新资讯28at.com

4、小结

我们一起探索了如何在Elasticsearch中创建并存储脚本,以及如何检索这些脚本,以确认它们的 id 和内容。我们还学习了如何在数据处理的摄取管道中调用这些存储的脚本。TpI28资讯网——每日最新资讯28at.com

通过这种方法,你可以有效地节省存储空间,并减少因重复编写相同脚本而可能出现的错误。简而言之,你只需编写和存储一次脚本,就可以在多个地方反复使用,这无疑提高了工作效率,同时也使得数据处理过程更加流畅和可靠。TpI28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-57396-0.htmlElasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 代码出错了,IDE竟然不报错?太诡异了....

下一篇: 记录业务系统操作日志方案实践

标签:
  • 热门焦点
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top