Elasticsearch:使用 ingest pipeline 来管理索引名称

news2024/11/26 18:27:37

在我之前的文章 “Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去” 我详述了如何使用已有的 date_index_name 处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如,我们想把 2023 年 4 月的所有文档写入到 my-index-2023-04-01 这个索引名称中去。这个处理器很好地解决了在很多情况下,我们需要把当月或者当年的索引放到我们需要的以文档时间戳相关索引名称中,这样便于以后的管理及搜索。

在今天的文章中,我们将以另外一种方式来实现同样的方案。

各种不同的方法来修改数据

在 Elastic Stack 中的使用中,我们有许多不同的方案来修改数据,比如:

在上面,我们使用定制的微服务来摄入商业应用文档,并使用我们的算法来修改文档,最终通过 client 库把文档写入到 Elasticsearch 中。这种方法的缺点是你需要编写相应的应用程序来完成。针对大量的数据,我们可能没有缓冲,有时我们甚至不能保证至少一次传输。这种在 Logstash 和 Filebeat 中都有实现。

我们也可以采用 Logstash 来对数据进行修改:

 

Logstash 提供了丰富的过滤器来帮助我们处理数据。你可以阅读文章 “Logstash:Logstash 入门教程 (一)” 以了解更多。这种方案的缺点是,为了应付 single point of failure 及负载均衡,你需要管理多个 Logstash 实例。这个需要额外的工作。  

在最新的开发者中,越来越多的开发者倾向于使用 ingest pipeline 来对数据进行处理。更多关于 ingest pipeline 的文章可以参考 “Elastic:开发者上手指南”。

Ingest 节点是 Elasticsearch 集群中的一类节点。它可以帮我们运行丰富的处理器来处理数据。由于它是 Elasticsearch 集群的一个部分,它可以很方便地进行扩容操作来应付更多的需求。 

使用  Ingest pipeline 的好处是:

  • 能够在不改变应用程序逻辑的情况下修改数据
  • 与 Logstash 相比的轻量级解决方案
  • 单独管理集群没有额外开销
  • 降低结构复杂性

尽管 ingest pipeline 有上面的很多优点,但是使用 ingest pipeline 也有一些局限性:

  • 无法将文档拆分为多个文档([Ingest Pipeline] Ability to split documents · Issue #56769 · elastic/elasticsearch · GitHub)
  • 由于摄取管道的性质,同时处理多个文档时可能会遇到挑战
  • 不能和外部的数据库进行 join 等操作,也无法访问外部的数据库并写入

除了上面所述的修改数据的方案中,另外一个就是通过 Beats processor 来对数据进行加工。你可以更进一步阅读 “Beats:Beats processors”。

把数据写入到我们想要的索引中去

我们接下来通过 ingest pipeline 的方法来把我们想要的数据写入到我们想要的索引中去。我们想把

比如在上面,我们可以看到一个字段叫做 created_at。它是发生在 2022-11-30 这个天。我们想把这个文档写入到我们想要的索引名称中 books.2022.11。道理很简单,我们就是想把当月的所有文档归于同样的一个索引名称 books.2022.11 这个索引中。以后便于归档及搜索。在实际的生产环境中,有这种需求。那么我们该如何实现我们的这种需求呢?

我们采用 ingest pipeline 来实现这个需求。我们在 Kibana 中打入如下的命令:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "Change index name according to created_at",
    "processors": [
      {
        "date": {
          "field": "created_at",
          "target_field": "index_suffix", 
          "formats": ["ISO8601"],
          "output_format": "yyyy.MM"
        }
      },
      {
        "set": {
          "field": "_index",
          "value": "{{ _index }}.{{index_suffix}}"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "created_at": "2023-04-13T23:57:11.092808962ZZ",
        "content": "This is Xiaoguo, Liu from Elastic"
      }
    }
  ]
}

运行上面的命令,我们看到的结果是:

{
  "docs": [
    {
      "doc": {
        "_index": "_index.2023.04",
        "_id": "_id",
        "_version": "-3",
        "_source": {
          "created_at": "2023-04-13T23:57:11.092808962ZZ",
          "content": "This is Xiaoguo, Liu from Elastic",
          "index_suffix": "2023.04"
        },
        "_ingest": {
          "timestamp": "2023-04-14T00:01:24.74589526Z"
        }
      }
    }
  ]
}

在上面,由于我们没有指定 _index,所以测试的结果是 _index.2023.04。在下面,如果我们指定 _index,那么就会自动替换我们想要的索引名称。上面显示它已经是我们想要的结果。我们可以创建如下的 pipeline:

PUT _ingest/pipeline/change_index_according_to_created_at
{
  "description": "Change index name according to created_at",
  "processors": [
    {
      "date": {
        "field": "created_at",
        "target_field": "index_suffix",
        "formats": [
          "ISO8601"
        ],
        "output_format": "yyyy.MM"
      }
    },
    {
      "set": {
        "field": "_index",
        "value": "{{ _index }}.{{index_suffix}}"
      }
    }
  ]
}

运行完上面的命令后,我们使用如下的命令来做测试:

PUT books/_doc/1?pipeline=change_index_according_to_created_at
{
  "created_at": "2023-04-13T23:57:11.092808962ZZ",
  "content": "This is Xiaoguo Liu from Elastic"
}

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

{
  "_index": "books.2023.04",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

如上所示,我们的 _index 名称现在变为 books.2023.04,而不是在写入时的 books。我们可以通过如下的命令来进行查询刚才写入的数据:

GET books.2023.04/_search

上面的命令返回:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "books.2023.04",
        "_id": "1",
        "_score": 1,
        "_source": {
          "created_at": "2023-04-13T23:57:11.092808962ZZ",
          "content": "This is Xiaoguo Liu from Elastic",
          "index_suffix": "2023.04"
        }
      }
    ]
  }
}

其实安装同样的套路,通过修改 _index,我们可以任意组合我们的索引名称。在生产环境中,我们更希望使用带有日期标签的名称来标识我们的索引!

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

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

相关文章

【QT】MainWindow中如何为菜单栏或工具栏中的Menu或Action设置快捷键

目录1. 设置快捷键的两种方法1.1 在控件title属性的某个字母前加上&,(Alt该字母)作为快捷键1.2 使用 setShortcuts,(Ctrl字母)作为快捷键2. 为菜单栏中的 menu 设置快捷键2.1 测试2.2 代码3. 为菜单栏或工具栏中的…

百兆以太网使用的电信号编码分析

以太网是一种计算机局域网的组网技术。在IEEE制定的IEEE 802.3标准给出了以太网的技术标准。它规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用普遍的局域网技术。它很大程度上取代了其他局域网标准,如令牌环、FDDI和ARCNET。 我们常见的网…

Netty通信技术进阶一

Netty通信技术进阶1. 概念2. 线程同步、异步3. 其他通信技术对比4. Netty中的Reactor实现5. Pipeline 和 Handler5.1 ChannelHandler 分类6. 入站事件传播7.inbound/outbound 加载顺序和执行顺序8. 出站事件传播9. Code example9.1 编写服务端9.2 编写客户端10. 核心组件10.1 B…

虚拟直播需要哪些设备?如何搭建虚拟直播团队?

虚拟直播不止是新兴的娱乐途径 ,还是新的商业模式 。虚拟直播的出现,是互联网娱乐趋势的变化,带来了更加丰富多彩的娱乐形式,同时也优化了传统直播模式下的人力物力成本,使直播行业更加效率及智能。 科技不断发展&…

JDBC(数据库连接)

MYSQL 数据库总结: http://t.csdn.cn/Ka9Vm JDBC是使用Java语言操作关系型数据库的一套API。 将mysql-connector-j-8.0.32jar复制粘贴到一个新建的目录里,然后右键mysql-connector-j-8.0.32jar,添加为库。 DriverManager 一个工厂类&…

2023易派客工业品展览会在苏州开幕

展厅面积达5.3万平方米,500多家重要工业领军企业参展,20组企业签署购销意向协议,签约金额超82亿元 ​ 4月13日,“2023易派客工业品展览会”在苏州国际博览中心开幕。展会以“绿色智造融通赋能”为主题,500多家重要工业…

CART分类树算法

1. CART分类树算法的最优特征选择方法 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.…

FreeRTOS中临界段的保护(笔记)

目录临界段的定义Cortex-M内核快速关开关中断的指令关中断开中断进入临界段的宏退出临界段的宏进入临界段,不带中断保护, 不能嵌套进入临界段,带中断保护版本,可以嵌套退出临界段,不带中断保护版本,不能嵌套…

【数据结构与算法】堆的实现(附源码)

目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…

Windows通过RDP异地远程桌面Ubuntu【内网穿透】

文章目录前言1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址前言 XRDP是一种开源工具,它允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP外,xrdp工具还接受来自其他RDP客户端(…

文心一格,百度AI作画产品

文章目录AIGC什么是AI作画?Prompt文心一格使用方法注册账号使用AI绘图AIGC的未来发展结语AIGC AIGC(AI Generated Content)是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容,GC的意思是创作内容。与之相对应的概念中…

ElasticSearch索引文档写入和近实时搜索

一、基本概念 1.Segments In Lucene 众所周知,ElasticSearch存储的基本单元Shard,ES中一个Index可能分为多个Shard,事实上每个Shard都是一个Lucence的Index,并且每个Lucene Index由多个Segment组成,每个Segment事实上…

【JS运算】分组求和/平均值(reduce函数)

对于数组求和的问题,使用reduce函数能够最快的解决 如果你还不会reduce函数,可以看这一篇: reduce函数的使用 思路 reduce函数对相同group的值进行迭代求和 将分组的总和除以组里的个数得到平均值,然后存储起来 Sum函数&#x…

Linux ubuntu更新meson版本

问题描述 在对项目源码用meson进行编译时,可能出现以下错误 meson.build:1:0: ERROR: Meson version is 0.45.1 but project requires > 0.58.0. 或者 meson_options.txt:1:0: ERROR: Unknown type feature. 等等,原因是meson版本跟设置的不适配。 …

Linux 学习总结(92)—— Linux 高效率使用技巧

1、跳转目录优雅顺滑 1.1 bd 命令 快速回到 Bash 中的特定父目录,而不是多余地键入 cd ../../..。如果在此路径中/home/radia/work/python/tkinter/one/two并且想快速转到目录 python,只需键入: bd python或者仅输入目录的前几个字母,如匹…

锁子甲 bulid+sim

链接: youtube 分析:洒一堆点——copy 模型——点和模型符合一定规律 点和点的距离符合上述图中的关系 (横纵) 横向 但是我们要横向10个点够了: 用modulo 除余 纵向 这里用除法向上取整 /10 eg : 0-9 得0 10-19 得1…

【逗号你真的懂吗?】C++与JAVA中逗号的区别

文章目录一、先上结论二、C中的逗号逗号运算符和逗号表达式三、JAVA中的逗号四、实战验证情况一:在定义(或声明)变量时利用逗号CJAVA情况二:在for循环条件中使用逗号CJAVA情况三:在函数形参参数列表中使用逗号CJAVA情况…

WPF_Application

文章目录Application1 Application类1.1 定义1.2 示例1.3 附注2 Application常用属性2.1 Current2.2 Dispatcher3 总结Application 1 Application类 1.1 定义 该类封装了一个WPF应用程序。 该类派生自DispatcherObject,实现了IQueryAmbient接口。 1.2 示例 以…

ICLR Spotlight | 卷积网络上的首个BERT/MAE预训练,ResNet也能用

“删除-再恢复” 形式的自监督预训练可追溯到 2016 年,早于 18 年的 BERT 与 21 年的 MAE。然而在长久的探索中,这种 BERT/MAE 式的预训练算法仍未在卷积模型上成功(即大幅超过有监督学习)。本篇 ICLR Spotlight 工作 “Designing…

PPP协议相关的知识

这只是我自己在学习时的总结,对于我有用的知识点,希望可以和大家分享,主要学习的文章如下,如有兴趣也可以去了解一下其他作者写的ppp协议的知识点。 PPP协议详解https://blog.csdn.net/m0_49864110/article/details/124987932?o…