当前位置:首页 > 科技  > 软件

来自钉钉群的问题—Elasticsearch 如何实现文件名自定义排序?

来源: 责编: 时间:2024-02-02 16:59:53 315观看
导读1、背景在数字时代,图像数据的管理已成为数据架构的一部分。然而,随之而来的挑战是如何有效地索引和检索这些图像文件。这不仅涉及存储,更重要的是如何根据特定的属性(如文件名中的数字)进行排序,以便用户可以按照预期的顺

1、背景

在数字时代,图像数据的管理已成为数据架构的一部分。然而,随之而来的挑战是如何有效地索引和检索这些图像文件。YBr28资讯网——每日最新资讯28at.com

这不仅涉及存储,更重要的是如何根据特定的属性(如文件名中的数字)进行排序,以便用户可以按照预期的顺序查看图像。YBr28资讯网——每日最新资讯28at.com

如下问题来自Elastic 钉钉技术交流群:YBr28资讯网——每日最新资讯28at.com

图片图片YBr28资讯网——每日最新资讯28at.com

2、解决方案探讨

在Elasticsearch中,我们经常面对需要对数据进行排序的需求。单就排序,咱们之前有过几篇文章分析不同业务场景的排序实现。YBr28资讯网——每日最新资讯28at.com

仅就上图中的文件名进行排序,会怎么样呢?我们构造一下数据,执行一下看。YBr28资讯网——每日最新资讯28at.com

用默认动态Mapping 结构,批量写入数据。

POST /my_photos/_bulk{ "index" : { "_id" : "1" } }{ "photo_id" : "photo1.jpg", "upload_date" : "2024-02-01T10:00:00" }{ "index" : { "_id" : "2" } }{ "photo_id" : "photo2.jpg", "upload_date" : "2024-02-01T10:05:00" }{ "index" : { "_id" : "3" } }{ "photo_id" : "photo12.jpg", "upload_date" : "2024-02-01T10:10:00" }{ "index" : { "_id" : "4" } }{ "photo_id" : "photo111.jpg", "upload_date" : "2024-02-01T10:15:00" }### 执行检索GET /my_photos/_search{  "query": {    "match_all": {}  },  "sort": [    {      "photo_id.keyword": {        "order": "asc"      }    }  ]}

召回结果,同图中后半部分结果一致。YBr28资讯网——每日最新资讯28at.com

图片图片YBr28资讯网——每日最新资讯28at.com

结果并没有达到预期。YBr28资讯网——每日最新资讯28at.com

而可行的解决方案,还得从文件名入手才可以。图像文件名包含数字,需要根据这些数字进行排序,这才是根本!YBr28资讯网——每日最新资讯28at.com

3、解决方案实现

我们采用两种不同的解决方案来尝试解决这个问题。YBr28资讯网——每日最新资讯28at.com

第一种:基于脚本排序。YBr28资讯网——每日最新资讯28at.com

第二种:复杂问题简单化,预处理管道拆分出数值字段,基于数值排序。YBr28资讯网——每日最新资讯28at.com

3.1 方案1:脚本排序实现

使用 _script 进行排序是一种灵活的方法,它允许我们编写自定义脚本来解析文件名并提取排序依据的数字。YBr28资讯网——每日最新资讯28at.com

GET /my_photos/_search{  "query": {    "match_all": {}  },  "sort": {    "_script": {      "type": "number",      "script": {        "lang": "painless",        "source": """          String photoId = doc['photo_id.keyword'].value;          if (photoId == null) return 0;          Matcher m = /[0-9]+/.matcher(photoId);          if (m.find()) {            return Integer.parseInt(m.group(0));          } else {            return 0;          }        """      },      "order": "asc"    }  }}

执行结果已经有序:YBr28资讯网——每日最新资讯28at.com

图片图片YBr28资讯网——每日最新资讯28at.com

上述脚本基于正则表达式从photo_id字段中查找并提取出数字,如果找到就返回这个数字,如果找不到就返回0。YBr28资讯网——每日最新资讯28at.com

这样的操作对于根据数字对文档进行排序非常有用。YBr28资讯网——每日最新资讯28at.com

虽然这种方法非常强大,但它可能会因为脚本的执行而影响查询性能,数据量巨大的时候,咱们要慎用!YBr28资讯网——每日最新资讯28at.com

3.2 方案2:预处理解决方案实现

除了上面的方案,另一种方法是在索引数据时使用Ingest管道预处理图像文件名。YBr28资讯网——每日最新资讯28at.com

这样可以在数据索引时就提取出文件名中的数字并存储在一个专门的字段中。YBr28资讯网——每日最新资讯28at.com

这种方法的好处是可以显著提高排序的效率,因为数字已经被预处理并作为数值类型存储,使得排序操作更加快速。YBr28资讯网——每日最新资讯28at.com

就是开头咱们提到的复杂问题简单化。YBr28资讯网——每日最新资讯28at.com

创建预处理管道,基于 grok 提取数值字段

PUT _ingest/pipeline/extract_photo_number{  "description": "Extracts numbers from photo_id and stores it in photo_number",  "processors": [    {      "grok": {        "field": "photo_id",        "patterns": ["%{NUMBER:photo_number:int}"]      }    }  ]}DELETE my_photos_20240201### 创建索引的时候,记得指定上面创建好的预处理管道。### 新增的字段photo_number,和上面的预处理管道获取的字段一一对应。PUT my_photos_20240201{  "settings": {    "default_pipeline":"extract_photo_number"  },   "mappings": {    "properties": {      "photo_id": {        "type": "text",        "fields": {          "keyword": {            "type": "keyword",            "ignore_above": 256          }        }      },      "photo_number": {        "type": "long"      },      "upload_date": {        "type": "date"      }    }  }}### 批量写入数据POST /my_photos_20240201/_bulk{ "index" : { "_id" : "1" } }{ "photo_id" : "photo1.jpg", "upload_date" : "2024-02-01T10:00:00" }{ "index" : { "_id" : "2" } }{ "photo_id" : "photo2.jpg", "upload_date" : "2024-02-01T10:05:00" }{ "index" : { "_id" : "3" } }{ "photo_id" : "photo12.jpg", "upload_date" : "2024-02-01T10:10:00" }{ "index" : { "_id" : "4" } }{ "photo_id" : "photo111.jpg", "upload_date" : "2024-02-01T10:15:00" }### 执行检索和排序POST my_photos_20240201/_search{  "query": {    "match_all": {}  },  "sort": [    {      "photo_number": {        "order": "asc"      }    }  ]}

官方文档参考:YBr28资讯网——每日最新资讯28at.com

https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.htmlYBr28资讯网——每日最新资讯28at.com

执行结果如下:YBr28资讯网——每日最新资讯28at.com

图片图片YBr28资讯网——每日最新资讯28at.com

与脚本排序对比可以看出:YBr28资讯网——每日最新资讯28at.com

  • 预处理方案数据的处理逻辑前移,发生在数据索引的阶段,而非查询阶段;
  • 查询时可以直接依据数值类型的 photo_number字段进行快速排序,无需在查询时动态解析文本字段,从而提高了查询性能,并减少了对资源的消耗。
  • 还提升了数据结构的清晰度和索引的整体效率。

4、小结

本文探讨了在Elasticsearch中对包含数字的图像文件名进行排序的挑战及其解决方案。YBr28资讯网——每日最新资讯28at.com

在选择哪种方案时,我们需要考虑实际需求和系统资源。YBr28资讯网——每日最新资讯28at.com

如果对性能有较高要求,预处理方案更为合适。但如果需求复杂多变,可能需要脚本排序的灵活性。YBr28资讯网——每日最新资讯28at.com

我更想跟大家探讨的是:未来的数据建模应考虑到数据的索引和查询模式。YBr28资讯网——每日最新资讯28at.com

例如,如果我们知道将来需要按照文件名中的数字排序,那么在设计数据模型时就应该考虑到这一点,以便于实现高效的查询。YBr28资讯网——每日最新资讯28at.com

前置考虑得越充分,后面就越省事!YBr28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-71940-0.html来自钉钉群的问题—Elasticsearch 如何实现文件名自定义排序?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用Go Gin SecureJSON技术保护你的JSON数据

下一篇: 现代 PHP 应用程序服务器FrankenPHP,自动支持HTTPS/HTTP2/HTTP3

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 一加首款折叠屏!一加Open渲染图出炉:罕见单手可握小尺寸

    8月5日消息,此前就有爆料称,一加首款折叠屏手机将会在第三季度上市,如今随着时间临近,新机的各种消息也开始浮出水面。据悉,这款新机将会被命名为“On
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼‍‍‍‍‍‍‍‍‍‍东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一
Top