成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

來自釘釘群的問題—Elasticsearch 如何實現文件名自定義排序?

開發 前端
本文探討了在Elasticsearch中對包含數字的圖像文件名進行排序的挑戰及其解決方案。在選擇哪種方案時,我們需要考慮實際需求和系統資源。

1、背景

在數字時代,圖像數據的管理已成為數據架構的一部分。然而,隨之而來的挑戰是如何有效地索引和檢索這些圖像文件。

這不僅涉及存儲,更重要的是如何根據特定的屬性(如文件名中的數字)進行排序,以便用戶可以按照預期的順序查看圖像。

如下問題來自Elastic 釘釘技術交流群:

圖片圖片

2、解決方案探討

在Elasticsearch中,我們經常面對需要對數據進行排序的需求。單就排序,咱們之前有過幾篇文章分析不同業務場景的排序實現。

僅就上圖中的文件名進行排序,會怎么樣呢?我們構造一下數據,執行一下看。

用默認動態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"
      }
    }
  ]
}

召回結果,同圖中后半部分結果一致。

圖片圖片

結果并沒有達到預期。

而可行的解決方案,還得從文件名入手才可以。圖像文件名包含數字,需要根據這些數字進行排序,這才是根本!

3、解決方案實現

我們采用兩種不同的解決方案來嘗試解決這個問題。

第一種:基于腳本排序。

第二種:復雜問題簡單化,預處理管道拆分出數值字段,基于數值排序。

3.1 方案1:腳本排序實現

使用 _script 進行排序是一種靈活的方法,它允許我們編寫自定義腳本來解析文件名并提取排序依據的數字。

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"
    }
  }
}

執行結果已經有序:

圖片圖片

上述腳本基于正則表達式從photo_id字段中查找并提取出數字,如果找到就返回這個數字,如果找不到就返回0。

這樣的操作對于根據數字對文檔進行排序非常有用。

雖然這種方法非常強大,但它可能會因為腳本的執行而影響查詢性能,數據量巨大的時候,咱們要慎用!

3.2 方案2:預處理解決方案實現

除了上面的方案,另一種方法是在索引數據時使用Ingest管道預處理圖像文件名。

這樣可以在數據索引時就提取出文件名中的數字并存儲在一個專門的字段中。

這種方法的好處是可以顯著提高排序的效率,因為數字已經被預處理并作為數值類型存儲,使得排序操作更加快速。

就是開頭咱們提到的復雜問題簡單化。

創建預處理管道,基于 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"
      }
    }
  ]
}

官方文檔參考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.html

執行結果如下:

圖片圖片

與腳本排序對比可以看出:

  • 預處理方案數據的處理邏輯前移,發生在數據索引的階段,而非查詢階段;
  • 查詢時可以直接依據數值類型的 photo_number字段進行快速排序,無需在查詢時動態解析文本字段,從而提高了查詢性能,并減少了對資源的消耗。
  • 還提升了數據結構的清晰度和索引的整體效率。

4、小結

本文探討了在Elasticsearch中對包含數字的圖像文件名進行排序的挑戰及其解決方案。

在選擇哪種方案時,我們需要考慮實際需求和系統資源。

如果對性能有較高要求,預處理方案更為合適。但如果需求復雜多變,可能需要腳本排序的靈活性。

我更想跟大家探討的是:未來的數據建模應考慮到數據的索引和查詢模式。

例如,如果我們知道將來需要按照文件名中的數字排序,那么在設計數據模型時就應該考慮到這一點,以便于實現高效的查詢。

前置考慮得越充分,后面就越省事!

責任編輯:武曉燕 來源: 銘毅天下Elasticsearch
相關推薦

2021-04-18 10:34:28

Spring Clou郵件釘釘

2020-02-17 15:17:57

釘釘

2019-09-27 16:05:42

釘釘自定義工作臺移動門戶

2021-04-21 09:16:04

Python開發釘釘群機器人

2020-04-14 15:33:37

Python 釘釘機器人

2009-11-25 14:36:39

PHP函數usort(

2021-05-29 14:14:16

阿里云釘釘低代碼開發

2020-06-10 14:01:46

阿里云釘釘Windows

2016-09-06 18:20:43

存儲

2018-08-10 12:56:00

大數據

2023-08-22 20:48:06

模型釘釘阿里云

2022-12-06 08:00:16

awscli工具監控

2009-09-07 22:00:15

LINQ自定義

2009-06-29 09:57:05

Unix

2014-12-30 11:51:35

ListViewItem View

2018-08-07 11:51:27

釘釘

2018-04-18 07:20:12

微信騰訊阿里巴巴

2018-07-16 12:22:42

白熊視頻

2018-07-03 15:03:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 成人av在线播放 | 国产一区二区a | 91精品久久久久久久久中文字幕 | 精品国产一区二区国模嫣然 | 91玖玖 | 久久88| 中文字幕免费观看 | 欧美综合在线视频 | 国产欧美日韩在线观看 | 亚洲欧美中文字幕在线观看 | 成人三级视频 | 一区二区三区精品视频 | 亚洲精品视频一区二区三区 | 精品国产一区二区三区性色av | 国产精品久久久久久久久久了 | 久草网址 | 在线看国产| 国产999精品久久久 精品三级在线观看 | 精品毛片在线观看 | 亚洲va欧美va人人爽午夜 | 成人国产在线观看 | 一区二区三区中文字幕 | 91热在线| 视频一区在线播放 | 成人久草| 观看av| 久久久久免费精品国产小说色大师 | 亚洲精品一区中文字幕乱码 | 欧美成人免费在线视频 | 日韩欧美在线一区二区 | 久综合 | 91在线视频免费观看 | 成人国产一区二区三区精品麻豆 | www国产精品 | 欧美日韩在线播放 | 特级做a爰片毛片免费看108 | 欧美日韩国产一区二区三区 | 欧美精品一区在线 | 999久久久久久久 | 日韩欧美在线不卡 |