es pipeline 脚本的一些使用案例 (动态索引和字段格式化)

本文介绍了如何利用Canal将MySQL数据导入Elasticsearch,并根据字段值动态路由到不同索引。通过创建脚本处理器,实现了字段b为0的数据进入index_a,否则进入index_b。同时,展示了如何使用Painless脚本将日期格式转换为时间戳,便于数据处理。在处理亿级别数据时,注意Canal文档不全,需谨慎使用。
摘要由CSDN通过智能技术生成

背景

公司有个需要将数据从mysql导入es,要求字段b如果为0,那么将该条数据方式索引index_a,否则放入index_b, 由于数据库中存储的时间格式为date,存入es时需要转换为时间戳。
数据量大概在亿级别,这边导入数据使用的是阿里的canal,canal文档不全,还有些已经过时,笔者踩了许多坑。总之慎用

解决方案

当时接到需求以为是不可能实现的(原谅我对es知之甚少),后来在浏览canal issues 时,#3604 有人提到将数据按月切分,其中clannad2000 提出使用es pipeline的处理方案。各位可以去看看原答案,此处将我的代码放出
es 按数据动态路由至索引

//创建脚本
PUT _ingest/pipeline/fmtbfield
{
  "processors": [
    {
      "script": {
        "source": "ctx._index=ctx.b==0?'indexa':'indexb'"
      }
    }
  ]
}

//创建主索引(这个索引没什么用,不会存数据,但是必须有)
PUT /index
{
  "settings": {
    "index.default_pipeline": "fmtbfield"
  },
  "mappings": {
      "properties": {
        "id": {
          "type": "long"
        }, 
        "myTime": {
          "type": "long"//这里使用date也行,能自由接收时间戳和yyyymmdd这种形式的时间
        },
        "b": {
          "type": "text"
        }
      }
  }
}


//向index插入一条数据
PUT /index/_doc/1
{
  "id":1,
  "b":0
}

//由于脚本存在,实际插入的索引位置为indexa
GET /indexa/_search
{
  "query": {
    "match_all": {}
  }
}

插入时转换时间戳

这里转换为时间戳只是一个引子,假设你想加减乘除等等,对脚本而言都不在话下。

PUT _ingest/pipeline/fmtFieldToTime
{
  "processors": [
    {
      "script": {
        "lang": "painless",
        "source": """
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse(ctx.myTime);
        ctx.acctime = date.getTime();
      """
      }
    }
  ]
}

PUT /index_time
{
  "settings": {
   "final_pipeline" : "fmtFieldToTime"
  },
  "mappings": {
      "properties": {
        "id": {
          "type": "long"
        }, 
        "myTime": {
          "type": "long"//这里使用date也行,能自由接收时间戳和yyyymmdd这种形式的时间
        },
        "b": {
          "type": "text"
        }
      }
  }
}

PUT /index_time/_doc/1
{
  "id":1,
  "myTime":"2021-09-28 10:52:41"
}
查询时时间已经被转化成时间戳了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值