Elasticsearch:使用 Elasticsearch ingest pipeline 丰富数据

news2024/11/27 4:02:23

在我之前的文章:

  • Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标

  • Elasticsearch:enrich processor (7.5发行版新功能)

我有详细描述如何使用 ingest pipeline 来丰富数据。在今天的文章中里,我们来更加详细地使用一个具体的例子来进行展示。更多官方文档描述,我们可以详细参阅文章 Enrich your data | Elasticsearch Guide [8.8] | Elastic。

什么是丰富数据

简单地说,我们可以使用其他的数据集里的数据添加到现有的数据集中。这样在我们的最终的数据集中,它含有另外一个数据集里的数据供我们分析数据。我们知道如果是独立于 Elasticsearch 的数据库,我们只有通过 Logstash 来完成这种操作。针对两个不同的 Elasticsearch 索引来说,我们可以使用 enrich processor 来完成两个不同的数据集之间的 “join” 操作。比如:

如上所示,我们有两个数据集:registration 及 customer。他们的数据分别如上所示。 它们是以 JSON 格式来进行表达的。我们可以通过 email 进行关联,那么最终我们可以得到如图右边的那个被丰富的数据。这个数据它不仅含有 registraion 里的数据,而且它还含有 customer 里的数据。从某种意义上讲,我们把两个不同的数据集通过 email 进行关联,并最终形成了一个被丰富的数据集。这个对于我们最终分析数据非常有效。

Elasticsearch enrich processor 的工作流程如下:

数据描述 

我们假想有一个活动的  signup 应用。在活动签名的时候这个应用收集了如下的信息:

如上所示,它只含有 email,location_id,paid_amount 及 product 四个字段的信息。这个信息被保存于一个 CSV 文件中。之后,市场部门提供了更多的信息表格给我我们。这些信息包含 location,member_type 及 user 等信息。

为了方便大家理解这个问题,我们可以在地址 GitHub - liu-xiao-guo/elasticsearch-ingest  找到相应的数据表述:

location.csv

 user.csv

member_type.csv

 signup.csv

 我们希望通过 enrich processor 的处理,我们最终能得到像如下结果的数据集:

也就是说,我们通过 enrich processor 的一番操作,我们可以把匹配的 user,location 及 member_type 信息添加进来,也即丰富原来的数据。

 

导入数据

我们可以使用 Kibana 来写入数据:

导入 user.csv

 

 

 

 

导入 location.csv

 

 

 

 在上面我们需要修改 point 为 geo_point 数据类型。

 

 

 

导入 member_type.csv

按照同样的方法,我们来导入 member_type.csv:

 

 

 在上面,我们添加了如下的 json processor:

    {
      "json" : {
        "field" : "price_range"
      }
    }

 

 

 

 

创建 enrich policy

我们可以参考链接:https://github.com/liu-xiao-guo/elasticsearch-ingest/blob/master/part-2/policy/user.txt

// Create users policy
PUT /_enrich/policy/user_policy
{
  "match": {
    "indices": "user",
    "match_field": "email",
    "enrich_fields": ["first_name", "last_name", "city", "zip", "state"]
  }
}

PUT /_enrich/policy/user_policy/_execute

我们在 Kibana 中运行上面的命令。在上面的 user_policy 中,我们使用 user 索引中的 email 字段,如果有匹配的话,那么 user 索引中相应的文档的 first_name,last_name,city,zip 及 state 将被丰富到文档中。

我们参考链接:https://github.com/liu-xiao-guo/elasticsearch-ingest/blob/master/part-2/policy/location.txt

PUT /_enrich/policy/location_policy
{
  "match": {
    "indices": "location",
    "match_field": "location_id",
    "enrich_fields": ["point"]
  }
}

PUT /_enrich/policy/location_policy/_execute

 在 Kibana 中运行上面的命令。

我们参考链接:https://github.com/liu-xiao-guo/elasticsearch-ingest/blob/master/part-2/policy/member_type.txt

// Create member_type policy
PUT /_enrich/policy/member_type_policy
{
  "range": {
    "indices": "member_type",
    "match_field": "price_range",
    "enrich_fields": ["member_type"]
  }
}

PUT /_enrich/policy/member_type_policy/_execute

我们在 Kibana 中运行上面的命令。

我们可以在 index management 中查看到新生成的 enrich index:

导入 signup.csv

 

 

 

如果你看看我们之前想要的结果的数据 mapping:

我们需要添加 geo 字段:

    "geo": {
      "properties": {
        "point": {
          "type": "geo_point"
	      }
      }
    }

我们需要更进一步修改 ingest pipeline。我们参考链接:https://github.com/liu-xiao-guo/elasticsearch-ingest/blob/master/part-2/pipeline/signup.json

我们需要添加如下的三个 enrich processor:

    {
      "enrich" : {
        "description": "Add 'user' data based on 'email'",
        "policy_name": "user_policy",
        "field" : "email",
        "target_field": "user",
        "max_matches": "1"
      }
    },
    {
      "enrich" : {
        "description": "Add 'member_type' data based on 'paid_amount'",
        "policy_name": "member_type_policy",
        "field" : "paid_amount",
        "target_field": "member_type",
        "max_matches": "1"
      }
    },
    {
      "enrich" : {
        "description": "Add 'geo' data based on 'location_id'",
        "policy_name": "location_policy",
        "field" : "location_id",
        "target_field": "geo",
        "max_matches": "1"
      }
    },

 点击上面的 import 按钮:

 

 

我们接下来针对 signup 索引来做一个搜索:

GET signup/_search?filter_path=**.hits

上面的命令返回的结果为:

{
  "hits": {
    "hits": [
      {
        "_index": "signup",
        "_id": "Q9mvgokBWubr9hCu1VXI",
        "_score": 1,
        "_source": {
          "member_type": {
            "member_type": "regular",
            "price_range": {
              "lte": 5
            }
          },
          "geo": {
            "location_id": 2351,
            "point": "POINT(-71.61 42.28)"
          },
          "product": "earlybird",
          "paid_amount": 5,
          "user": {
            "zip": 9303,
            "city": "Arleta",
            "last_name": "Fly",
            "state": "CA",
            "first_name": "Marty",
            "email": "martymcfly@backtothefuture.com"
          },
          "email": "martymcfly@backtothefuture.com",
          "location_id": 2351
        }
      },
      {
        "_index": "signup",
        "_id": "RNmvgokBWubr9hCu1VXI",
        "_score": 1,
        "_source": {
          "member_type": {
            "member_type": "regular",
            "price_range": {
              "lte": 5
            }
          },
          "geo": {
            "location_id": 2322,
            "point": "POINT(-71.63 42.56)"
          },
          "product": "earlybird",
          "paid_amount": 5,
          "user": {
            "zip": 58008,
            "city": "Springfield",
            "last_name": "Simpson",
            "state": "OR",
            "first_name": "Homer",
            "email": "homersimpson@springfield.com"
          },
          "email": "homersimpson@springfield.com",
          "location_id": 2322
        }
      },
      {
        "_index": "signup",
        "_id": "RdmvgokBWubr9hCu1VXI",
        "_score": 1,
        "_source": {
          "member_type": {
            "member_type": "premium",
            "price_range": {
              "gt": 5
            }
          },
          "geo": {
            "location_id": 2019,
            "point": "POINT(-72.68 42.2)"
          },
          "product": "regular",
          "paid_amount": 10,
          "user": {
            "zip": 99686,
            "city": "Valdez",
            "last_name": "Riker",
            "state": "AK",
            "first_name": "Will",
            "email": "willriker@federation.com"
          },
          "email": "willriker@federation.com",
          "location_id": 2019
        }
      }
    ]
  }
}

从上面的输出中,我们可以看出来我们已经成功地丰富了 signup 索引。

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

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

相关文章

Stable Diffusion入门笔记(自用)

学习视频:20分钟搞懂Prompt与参数设置,你的AI绘画“咒语”学明白了吗? | 零基础入门Stable Diffusion保姆级新手教程 | Prompt关键词教学_哔哩哔哩_bilibili 1.图片提示词模板 2.权重(提示词) 无数字 (flower)//花的…

1 快速构建mybatis项目

1.1 使用Maven的quickstart框架 注意是不出现w的quickstart&#xff1a; 1.2 加入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</s…

如何评测一个大语言模型?

编者按&#xff1a;大型语言模型&#xff08;Large language models, LLMs&#xff09;因其在学术界和工业界展现出前所未有的性能而备受青睐。随着 LLMs 在研究和实际应用中被广泛使用&#xff0c;对其进行有效评测变得愈发重要。近期已有多篇论文围绕大模型的评测进行研究&am…

二级分类基本实现步骤(小兔鲜儿)【Vue3】

二级分类 整体认识和路由配置 二级分类功能描述 配置二级路由 准备组件模版 <script setup></script><template><div class"container "><!-- 面包屑 --><div class"bread-container"><el-breadcrumb separa…

OA会议管理系统之会议发布(内含原型图项目介绍多功能下拉框源码)

目录 一、前言 1.什么是OA会议 2.OA会议项目背景 二、会议发布功能实现 1.功能介绍 2.功能分析 1.原型图以及数据表分析 2.查看官网搭建JSP页面 3.功能实现 1.实体类 2.dao层 3.JSP页面 4.Web层 4.案例演示 一、前言 1.什么是OA会议 会议OA指的是会议办公自动化…

设计模式结构型——外观模式

目录 什么是外观模式 外观模式的实现 外观模式的特点 什么是外观模式 外观模式&#xff08;Facade Pattern&#xff09;&#xff1a;又叫作门面模式&#xff0c;归属于结构型模式。外观模式定义了提供了定义了一个统一的高层接口&#xff0c;即为子系统中的一组接口提供一个…

PMP 数据收集工具与技术

数据收集工具与技术 (9个) 标杆对照 标杆对照是指将实际或计划的产品、流程和实践与其他可比组织的 做法进行比较&#xff0c;以便识别最佳实践、形成改进意见&#xff0c;并为绩效考核 提供依据。 头脑风暴 头脑风暴是一种数据收集和创意技术&#xff0c;主要用于在短时间…

苍穹外卖day05——Redis(被病毒入侵)+店铺营业状态设置

Redis被病毒入侵了 数据删光光然后只剩这四个玩意&#xff0c;乱下东西乱删东西&#xff0c;还好是docker部署&#xff0c;不然就寄了。 在服务器上部署redis记得一定要设置密码&#xff0c;不然被人扫肉鸡注入病毒整个服务器给你崩掉。 使用配置类的方式搭建相关程序 配置数…

【华为OD机试】经典屏保【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”, 如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹: 请根据如下要求,实现屏保Logo坐标的计算算法 1、屏…

[23] TriPlaneNet: An Encoder for EG3D Inversion

paper | code | project 总结&#xff1a; 任务是3D GAN Inversion&#xff0c;旨在找到给定图像的隐码/Tri-plane。现有方法可分为Optimizaiton-based methods和encoder-based methods。前者旨在通过损失找到最优隐码&#xff0c;后者旨在学习给定图片和隐码的映射关系。前者…

蚁剑--编码器的利用

先说下蚁剑编码器的作用&#xff0c;当使用蚁剑控制webshell向服务器发送数据包时&#xff0c;数据包中的body部分会按照编码器中定义的规则进行编码或者加密后在发送&#xff0c;这样就可以避免有比较明显的命令执行特征从而被WAF拦截。 我们平时遇到一些文件上传漏洞&#x…

maven的pom.xml文件解释(远程仓库阿里云)

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

layui上传文件弹出请求上传接口出现异常的终极解决方案(v2.68版本、ajax底层逻辑修改、debug快速定位)

layui不同版本情况系列 解决layUI请求上传接口出现异常的解决方案layui框架实战案例(3)&#xff1a;layui上传错误请求上传接口出现异常解决方案漏刻有时导入数据layUI上传提示“请求上传接口出现异常”的解决方案layui上传文件弹出请求上传接口出现异常的终极解决方案 layui上…

C语言库函数 — 错误信息报告函数

前言 本文介绍错误信息报告函数 错误信息报告函数的作用&#xff1a; 帮助程序员快速定位代码中的错误&#xff0c;以便更快地进行调试和修复问题。 文章目录 前言一、错误信息报告函数什么是错误信息报告函数错误信息报告函数的作用strerror函数介绍strerror函数使用错误码对应…

NLP多模型集成与比较

目录 数据集目的所用的两种词嵌入方式步骤随机读取10000条文本TF-IDF方法多模型比较CNN (用于比较 TF-IDF嵌入和词向量嵌入时的区别)LSTMBI-LSTM 数据集 10分类的新闻文本分类任务 目的 1.比较不同数据处理方式&#xff0c;词嵌入方式对任务的影响 2.比较相同处理方式下&…

对于awd

最近我们老师直接说要我准备awd&#xff0c;大概率要我上场我就顺便整理一下awd的资料&#xff08;准备写很多所以建议大家收藏一下&#xff09; 攻防指北 先来一个思维导图 Awd竞赛 AWD(Attack With Defense&#xff0c;攻防兼备)是一个非常有意思的模式&#xff0c;你需要…

4P营销模型

4P营销模型 菲利普科特勒在其畅销书《营销管理&#xff1a;分析、规划与控制》中进一步确认了以4P为核心的营销组合方法. 模型介绍 「4P营销模型」是市场营销中的经典理论&#xff0c;代表了产品、价格、促销和渠道四个要素。这些要素是制定市场营销策略和实施计划的关键组成部…

ARM(Day5)

思维导图&#xff1a; 通过封装函数实现点灯&#xff1a;

CAN转EtherNet/IP网关can协议支持哪两种报文

你是否曾经遇到过不同的总线协议难以互相通信的问题&#xff1f;远创智控的YC-EIP-CAN网关为你解决了这个烦恼&#xff01; 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备&#xff0c;它能够将各种CAN总线和ETHERNET/IP网络连接起来&#xff0c;解决不同总线协议之间的通信障…

小程序 methods方法互相调用 this.onClickCancel is not a function

背景 做了一个自定义的弹出对话窗口&#xff0c;主要是自定义一些文本颜色。 问题 但是点击按钮事件&#xff1a;取消与确认&#xff0c;调用了同一个接口&#xff0c;然后想着走不同方法&#xff0c;需要调用methods其他方法。然后报错了&#xff1a; VM1081 WAService.js:…