当用户输入一堆这样的字符串到 Elasticsearch ?

news2025/1/18 6:18:21

1、问题引出

如下样例数据已导入 Elasticsearch,如何实现特定字段检索?并计算出特定子字段的长度?

0d6f09d4436db34aea1afc565ae11070.png

"message": "[策略排序]排序后结果:[{\"intentItems\":[\"200001\"],\"level\":1,\"moduleCode\":\"CENTER_PIT\",\"priority\":100,\"ruleId\":3947,\"sortScore\":9900.0,\"strategyId\":1000,\"strategyItemId\":1003}],deviceId:0aa81c2d-5ec9-3c09-81ba-7857709379ad"

2、问题拆解

  • 大前提:Elasticsearch document 都是以 json 形式存储的。

  • 问题引出部分的数据不够规范,本意是 json 数据,实则存储为了字符串。

  • 存储为字符串就带来了后续检索的极大不便利性。

所以,需要考虑做一下转换。

转换的方式有很多,写入的时候 json 解析一下再写入,大家都能想到。

有没有更为快捷的方式呢?这时候考虑用一下 ingest pipeline 的预处理功能中的 json processor。

237c14141957ce0c341e8bb38ac3d087.png

3、具体实现

第一步:样例数据格式化。

POST test-009/_bulk
{"index":{"_id":1}}
{"message":"{\"rst\":[{\"intentItems\":[\"200001\", \"200002\"],\"level\":1,\"moduleCode\":\"CENTER_PIT\",\"priority\":100,\"ruleId\":3947,\"sortScore\":9900.0,\"strategyId\":1000,\"strategyItemId\":1003}],\"deviceId\":\"0aa81c2d-5ec9-3c09-81ba-7857709379ad\"}"}

写入后,Kibana 检索召回如下所示。

第二步:字符串转 json

PUT _ingest/pipeline/msg2json_pipeline
{
  "processors": [
    {
      "json": {
        "field": "message",
        "target_field" : "json_msg"
      }
    },
    {
      "remove": {
        "field": "message",
        "if": "ctx.message != null"
      }
    }
  ]
}
  • json processor 用途:message 文本串转为 json_msg 目标 json 串。

  • remove processor 用途:原有的 message 字段已无实际意义,删除之,实际是“清理门户”,释放空间。

注意:ingest processor 是 Elasticsearch 5.0 开始就有的功能,随着版本的更迭,相关预处理器逐步丰富、扩展、完善和壮大。

第三步:验证 json 转换是否ok

POST test-009/_update_by_query?pipeline=msg2json_pipeline
{
  "query": {
    "match_all": {}
  }
}

POST test-009/_search
909b404a8fda46eaa1cb2659055feb2c.png

第四步:再求 intentItems 数组大小。

PUT _ingest/pipeline/len_pipeline
{
  "processors": [
    {
      "script": {
        "lang": "painless", 
        "source": """
        ctx.array_len = ctx.json_msg.rst[0].intentItems.size();
        """
      }
    }
  ]
}

POST test-009/_update_by_query?pipeline=len_pipeline
{
  "query": {
    "match_all": {}
  }
}

POST test-009/_search
a71f000da25744cb5ba2c352928caa7c.png

当然,update_by_query 不是最优方案,本文只是方便大家看到没一个细分步骤故意为之。

更为便捷的方案是:创建索引的时候指定 default_pipeline,把上面写的 json processor、ingest processor、remove processor 都整合到 default_pipeline 即可。

篇幅原因,不再展开。

4、小结

之前文章也多次强调,Elasticsearch 自带预处理功能比较强大,能满足绝大多数业务的基础数据清理、清洗、转换功能。

也有同学提问道:能否完全替换到 logstash 的 filter 功能。官方也强调过,是不可以的!!

以当下(2023-01-12)最新 Elasticsearch 8.6 版本为例,从数据量上跟大家详细说明一下:Logstash filter 插件个数为 48 个,而 Elasticsearch Ingest processors 个数为 40 个。再具体一点,Logstash filter 下的:logstash-integration-jdbc、logstash-filter-uuid 等 Elasticsearch Ingest processors 是不具备的。

一句话概括:Elasticsearch Ingest pipeline 能搞定的都交给它搞定预处理,搞不定的如果技术栈里面有 Logstash转交给 Logstash 的 filter 插件处理即可。

推荐阅读

  1. 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频

  2. 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单(2022年国庆更新版)

  3. 如何系统的学习 Elasticsearch ?

  4. 从一个线上问题看 Elasticsearch 数据清洗方式

  5. Elasticsearch的ETL利器——Ingest节点

  6. Elasticsearch 预处理没有奇技淫巧,请先用好这一招!

  7. 干货 | Logstash Grok数据结构化ETL实战

  8. 干货 | Logstash自定义正则表达式ETL实战

cbcd8a1b602705c4db9ac129a39515cc.jpeg

更短时间更快习得更多干货!

和全球 1800+ Elastic 爱好者一起精进!

e30312b950dd060e7f59cd1f9162277b.gif

比同事抢先一步学习进阶干货!

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

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

相关文章

2021帆软杯一等奖 | 《游乐园综合管理系统》

# 作品主题——游乐园综合管理系统 #作品简介:该获奖作品来自零代码开发赛道。针对一些个人经营、没有统一规范的游乐园,希望通过创建一个简单、高效的系统应用,管理人员能够通过对表单的简单操作就能管理游乐园,如获取工作人员信…

程序分析-动态程序切片

最近在调研符号执行工具优化方式时,发现好几篇工作都用到了动态程序切片,以前大部分接触的都是静态切片,对动态切片几乎不了解。所以开始学习动态切片,我主要参考的是90年的一篇上古paper。 1.静态依赖图和静态切片 说到程序切片…

Obsidian Templater 批量新建笔记

Obsidian Templater 批量新建笔记 背景 工作中的新项目都有这么几个固定的笔记,比如项目背景、原理图设计、PCB设计、调试等,每个笔记文件又有一些固定的内容,想着在开始一个新项目时,一次性把这些笔记都建好,并且统…

一文教会你 如何在Github中创建仓库?如何将多个项目放到一个仓库中管理?如何将本地项目上传到GitHub中?

文章目录前言1、如何在GitHub中创建仓库1.1 点击New repository1.2 填写仓库的基本信息1.3 完成创建2 、克隆仓库地址到本地2.1 克隆地址2.2 克隆到本地2.3 将后端代码项目提交到远程服务器2.4 将前端代码项目提交到远程服务器3、Github上查看自己上传项目代码4、使用这个方式存…

【程序分析】Code Lifting

我理解,Code Lifting和反编译的概念类似 常规的编译过程是这样的: 这是一个从高级形式到低级形式的过程,一般叫做 lowering 而反编译,是这样一个过程: 这个过程是完全相反的,叫做lifting 需要注意 Bi…

FPGA:逻辑函数的卡诺图化简法

文章目录最小项与最小项表达式最小项的定义最小项的性质逻辑函数的最小项表达式卡诺图化简法用卡诺图表示逻辑函数卡诺图的引出两变量卡诺图三变量卡诺图四变量卡诺图已知逻辑函数真值表,画卡诺图已知逻辑函数画卡诺图用卡诺图化简逻辑函数化简的依据化简的步骤用卡…

Hexo + Butterfly 侧边栏公众号

原文链接 :Hexo Butterfly 侧边栏公众号 推荐阅读 基于 Hexo 从零开始搭建个人博客(一): 环境准备基于 Hexo 从零开始搭建个人博客(二): 项目初识基于 Hexo 从零开始搭建个人博客(三): 主题安…

Lichee_RV学习系列--stream移植

Lichee_RV学习系列文章目录 Lichee_RV学习系列—认识Lichee Rv Dock、环境搭建和编译第一个程序 Lichee_RV学习系列—移植dhrystone 文章目录Lichee_RV学习系列文章目录一、stream简介二、源码下载三、文件移植1、makefile文件编译makefile文件移植四、运行结果五、移植过程中…

【尚硅谷】Java数据结构与算法笔记08 - 查找算法

文章目录一、查找算法介绍二、线性查找算法三、二分查找算法3.1 思路分析3.2 代码实现四、插值查找算法4.1 思路分析4.2 代码实现4.3 注意事项五、斐波那契(黄金分割法)查找算法5.1 思路分析5.2 原理讲解5.3 代码实现一、查找算法介绍 在 java 中, 我们…

C++多线程入门及基础知识

什么是C多线程 线程即操作系统进行CPU任务调度的最小单位。C的多线程并发,简单理解的话就是,将任务的不同功能交由多个函数实现,创建多个线程,每个线程执行一个函数,一个任务就同时由不同线程执行。 什么时候使用多…

微信小程序:骨架屏的实现方法

骨架屏是为了展示一个页面骨架而不含有实际的页面内容,从渲染效率上来讲,骨架屏它并不能使首屏渲染加快。由于骨架屏的一些使用又向用户渲染了额外的一些内容,这些内容是额外添加的、本来是不需要渲染的,它反而从整体上加长了首屏…

Windows 虚拟磁盘驱动开发(采用原始办法实现类似Storport框架的相同功能)

其实以前讲述windows平台下的磁盘驱动的开发挺多,而且时间也是非常早。以下连接:https://blog.csdn.net/fanxiushu/article/details/9903123?spm1001.2014.3001.5501https://blog.csdn.net/fanxiushu/article/details/11713357?spm1001.2014.3001.5501…

游戏开发 状态同步

【状态同步】1、将所有的操作发送给Server(T1),由Server计算(T2),并返回结果(T3)。权威服务器架构能够防止很多的作弊,但是直接用这种方法会让游戏的响应变得迟缓。如果 …

three games 之 桌球

接下来介绍一些 Vue4 中的一些进阶使用,希望对大家有所帮助,谢谢。 如果文中有不对、疑惑的地方,欢迎在评论区留言指正🌻 一、项目结构 Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则: …

移动硬盘怎么分区?

硬盘分区指的是硬盘上被划分出来的区块,可用于分类存储各种数据。而我们日常购买的移动硬盘通常来说分为两种,一种是买回来已分好区的,还有一种是未经过分区的。如果移动硬盘没有经过分区,那么在将它连接到电脑的USB接口时&#x…

android四大组件之四-BroadCast实现原理分析

前言: 一开始的目标是解决各种各样的ANR问题的,但是我们知道,ANR总体上分有四种类型,这四种ANR类型有三种是和四大组件相对应的,所以,如果想了解ANR发生的根因,对安卓四大组件的实现原理必须要…

伙伴云与飞书、金山办公一同入选亿欧2022中国数字化企业服务商TOP50

近日,由中关村国家自主创新示范区展示中心、中关村会展与服务产业联盟与亿欧联合举办的SHOWTECH2022-WIM 创新者年会”在京顺利召开,会上,亿欧网重磅发布《2022世界创新奖榜单》。伙伴云凭借10年来为企业数字化转型赋能的成功经验和卓越贡献&…

数据结构学习-队列

坚持看完,结尾有思维导图总结 这里写目录标题队列的定义于性质如何实现队列的功能初始化队列入队列出队列队列的销毁队列取队头数据队列取队尾数据判断队列是否为空判断队列长度总结队列的定义于性质 队列是一种数据结构,他储存数据的方式就和排队一样 …

二十六、Kubernetes中Horizontal Pod Autoscaler(HPA)控制器详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

年终盘点(三)丨2022计讯物联团队不负韶华,奋力前行

光阴荏苒,时光悄然,成长的齿轮不断转动。2022年,计讯人在挑战中创造不凡,2023年,计讯人在希望中迎接新未来。 回首过去,计讯物联团队不断壮大,在奋勇前行中以坚持书写拼搏,在知难而…