开发者社区> 工程师甲> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【最佳实践】如何使用 Elasticsearch ingest 节点来丰富日志和指标

简介: 丰富化是将权威来源的数据合并到文档中的过程,当将这些数据导入到 Elasticsearch 中时,并用其他信息丰富文档,通常可以帮助我们更好的对信息进行搜索或查看数据。
+关注继续查看

从历史上看,数据丰富功能仅在 Logstash 中可用,但由于 Elasticsearch 7.5.0 中引入了 enrich 处理器,因此可以直接在 Elasticsearch 中进行丰富,而无需配置单独的服务/系统。如果你想知道在 Logstash 中是如何实现,那么请参阅我之前的文章 “Logstash:运用 jdbc_streaming 来丰富我们的数据”。

由于通常用于丰富的主数据通常是在 CSV 文件中创建的,因此在此博客中,我们将逐步说明如何使用 CSV 文件中的数据将在摄取节点上运行的 enrich 处理器用于丰富数据。

样本 CSV 数据

我们可以使用阿里云Elasticsearch中的 Kibana ,或通过 ECS 自建 ELK,导入以下 CSV 格式的示例主数据,然后在将文档吸收到 Elasticsearch 中时用于丰富文档。 对于本博客中给出的示例,我们将主数据存储在一个名为 test.csv 的文件中。 此数据代表组织清单中的设备。

test.csv

"Device ID","Device Location","Device Owner","Device Type"
"device1","London","Engineering","Computer"
"device2","Toronto","Consulting","Mouse"
"device3","Winnipeg","Sales","Computer"
"device4","Barcelona","Engineering","Phone"
"device5","Toronto","Consulting","Computer"
"device6","London","Consulting","Computer"

请注意,CSV 数据不应包含任何其他空格,因为当前版本的 Data Visualizer 需要精确格式化数据。 在此 github 问题 中对此进行了记录。

将 CSV 数据导入 Elasticsearch

我们可以直接使用 Kibana 来把数据导入。打开 Kibana:

image.png

点击上面的 Import a CSV, NDJSON, or log file 链接:、

image.png

点击 Select or drag and drop a file, 然后选择刚才我们创建的 test.csv 文件:

image.png


点击 Import 按钮:

image.png

我们把导入的这个 index 的名字叫做 master_data_from_csv。点击 Import 按钮:

image.png

这样就完成了我们的 master_data_from_csv 的索引创建。我们可以在上面屏幕的下方的四个选项中任意选择一个来查看导入的数据。

利用我们的主数据丰富文档

在本节中,我们演示如何使用 enrich Processor 将主数据合并到输入数据流中的文档中。关于 enrich processor,我之前有另外一篇文章有详述“Elasticsearch:enrich processor (7.5发行版新功能)”。

image.png

第一步是创建一个丰富的策略,该策略定义我们将使用哪个字段将主数据与输入数据流中的文档进行匹配。 下面提供了适用于我们的数据的示例策略:

PUT /_enrich/policy/enrich-devices-policy
{
  "match": {
    "indices": "master_data_from_csv",
    "match_field": "Device ID",
    "enrich_fields": [
      "Device Location",
      "Device Owner",
      "Device Type"
    ]
  }
}

运行上面的策略。然后,我们使用 execute enrich policy API 为该策略创建 enrich 索引:

PUT /_enrich/policy/enrich-devices-policy/_execute

接下来,我们创建一个使用我们的丰富策略的 ingest pipeline。

PUT /_ingest/pipeline/device_lookup
{
  "description": "Enrich device information",
  "processors": [
    {
      "enrich": {
        "policy_name": "enrich-devices-policy",
        "field": "device_id",
        "target_field": "my_enriched_data",
        "max_matches": "1"
      }
    }
  ]
}

我们插入一个文档,并让它使用上面定义的 ingest pipeline,如下所示:

PUT /device_index/_doc/1?pipeline=device_lookup
{
  "device_id": "device1",
  "other_field": "some value"
}

我们可以使用 GET API 查看导入的文档,如下所示:

GET device_index/_doc/1

{
  "_index" : "device_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "my_enriched_data" : {
      "Device Location" : "London",
      "Device Owner" : "Engineering",
      "Device ID" : "device1",
      "Device Type" : "Computer"
    },
    "device_id" : "device1",
    "other_field" : "some value"
  }
}

在上面,我们可以看出来在返回的文档信息中,有多一个叫做 my_enriched_data 的字段。它包含了 Device Location, Device Owner, Device ID 及 Device Type。这些信息都来自于我们之前导入的 test.csv 文档信息。enrich processor 通过关联 device_id 为 device1 而从 master_data_from_csv 索引中获得这些信息。也就是说我们的数据变得更多了,这也就是我们之前说的丰富了。

在索引设置中指定pipeline

在上面,我们通过导入时指定的 pipeline 来进行调用 enrich processor,但是在实际的应用场景中,我们更加倾向于把这个配置与 index 的设置中,而不是在请求的url中来指定特定的 pipeline。我们可以通过在 index 的配置中添加 index.default_pipeline 来完成。

PUT device_index/_settings
{
  "index.default_pipeline": "device_lookup"
}

现在,发送到 device_index 的所有文档都将通过 device_lookup 管道,而无需在 URL 中使用 pipeline=device_lookup。 我们可以使用下面的 PUT 命令来验证它是否正常工作。

PUT /device_index/_doc/2
{
  "device_id": "device2",
  "other_field": "some value"
}

执行以下命令以查看我们刚刚提取的文档:

GET device_index/_doc/2

那么你可以看到如下所示的文档:

{
  "_index" : "device_index",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "my_enriched_data" : {
      "Device Location" : "Toronto",
      "Device Owner" : "Consulting",
      "Device ID" : "device2",
      "Device Type" : "Mouse"
    },
    "device_id" : "device2",
    "other_field" : "some value"
  }
}

结论

通常需要在导入时丰富文档,以确保 Elasticsearch 中的文档包含搜索或查看它们所需的信息。 在此博客中,我们演示了在 ingest 节点上运行的 enrich 处理器如何使用 CSV 数据进行扩充,这对于在将主数据吸收到 Elasticsearch 中时将主数据合并到文档中非常有用。

声明:本文由原文作者“ Elastic 中国社区布道师——刘晓国”授权转载,对未经许可擅自使用者,保留追究其法律责任的权利。
出处链接:https://elasticstack.blog.csdn.net/.


image.png

阿里云Elastic Stack】100%兼容开源ES,独有9大能力,提供免费 X-pack服务(单节点价值$6000)

相关活动


更多折扣活动,请访问阿里云 Elasticsearch 官网

阿里云 Elasticsearch 商业通用版,1核2G ,SSD 20G首月免费
阿里云 Logstash 2核4G首月免费


image.png

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云Elasticsearch日志场景最佳实践及引擎内核优化
本文整理自阿里巴巴技术专家郭嘉梁(梁楹)在 阿里云Elasticsearch 自研引擎年度发布 的演讲。
314 0
JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素
JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素
110 0
【最佳实践】Elasticsearch Snapshot 备份的使用方法
常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失。
2778 0
基于 Lerna 管理 packages 的 Monorepo 项目最佳实践
对于维护过多个package的同学来说,都会遇到一个选择题,这些package是放在一个仓库里维护还是放在多个仓库里单独维护,本文通过一个示例讲述了如何基于Lerna管理多个package,并和其它工具整合,打造高效、完美的工作流,最终形成一个最佳实践.
1300 0
阿里云OSS如何使用Bucket Policy授权其他账号访问指定数据?
在使用OSS对象存储时,我们可能会遇到这样的情况:由于业务需求,我们需要合作公司可以直接访问我公司中OSS指定的某些数据。 首先,登录对象存储控制台,选择需要授权其他公司访问的Bucket名称,在弹出的页面点击文件管理→授权→新增授权。
1687 0
POCO库中文编程参考指南(10)如何使用TCPServer框架?
1 TCPServer 框架概述 POCO 库提供TCPServer框架,用以搭建自定义的 TCP 服务器。TCPServer维护一个连接队列、一个连接线程池。连接线程用于处理连接,连接线程只要一空闲就不断地从连接队列中取连接并进行处理。
1770 0
Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
原文:Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App 安装VS2015 Update2的过程是非常曲折的。还好经过不懈的努力,终于折腾成功了。 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错。
1656 0
《C++编程规范:101条规则、准则与最佳实践》——导读
许多糟糕的编程规范都是由一些没有很好地理解语言、没有很好地理解软件开发或者试图标准化过多东西的人制定的。糟糕的编程规范会很快丧失可信度,如果程序员不喜欢或者不同意其中一些糟糕的准则,那么即使规范中有一些合理的准则,也可能被不抱幻想的程序员所忽略,这还是最好的情况,最坏的情况下,糟糕的标准可能真会被强
1499 0
+关注
工程师甲
搜索与推荐工程技术团队、阿里云Elasticsearch技术团队;
213
文章
4
问答
来源圈子
更多
相关文档: Elasticsearch
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载