前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当用户输入一堆这样的字符串到 Elasticsearch ?

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

作者头像
铭毅天下
发布2023-08-18 20:58:01
1340
发布2023-08-18 20:58:01
举报
文章被收录于专栏:铭毅天下铭毅天下

1、问题引出

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

代码语言:javascript
复制
"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。

3、具体实现

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
POST test-009/_update_by_query?pipeline=msg2json_pipeline
{
  "query": {
    "match_all": {}
  }
}

POST test-009/_search

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

代码语言:javascript
复制
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

当然,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 插件处理即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题引出
  • 2、问题拆解
  • 3、具体实现
    • 第一步:样例数据格式化。
      • 第二步:字符串转 json
        • 第三步:验证 json 转换是否ok
          • 第四步:再求 intentItems 数组大小。
          • 4、小结
          相关产品与服务
          对象存储
          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档