【原創】從s3桶將對象導入ES建立索引,以便快速查找文件

?

總體功能:

這段程序的作用是:

從指定的S3桶中讀取所有對象的元數據(文件名、大小、最后修改時間、存儲類型、ETag等),并把這些信息寫入到Elasticsearch(ES)中,建立索引,以便后續可以快速搜索和檢索S3中的文件信息。


各模塊詳細解析:

1. readConfig
  • 從本地的 config.ini 配置文件中讀取 S3 和 Elasticsearch 的連接信息,比如 S3的桶名、訪問秘鑰,ES的地址、賬號密碼、索引名等。


2. getS3ETag
  • 給定一個文件名(Key),向S3發送 HeadObject 請求,單獨獲取該文件的 ETag(一般用于文件完整性校驗或者去重標識)。

  • 特別處理了返回的ETag,把多余的引號去掉。


3. fetchS3Files
  • 核心邏輯

  • 通過 S3 的 ListObjectsV2Paginator分頁地遍歷桶中的所有對象。

  • 對每一個對象:

    • 讀取文件名(Key)、大小、最后修改時間、存儲類型。

    • 調用 getS3ETag 補充獲取 ETag。

    • 把這些元數據組織成一個 JSON 格式的文檔。

    • 通過 esapi.IndexRequest 把文檔寫入到Elasticsearch的指定索引中。


4. main
  • 先讀取配置文件。

  • 初始化 S3 客戶端(帶自定義 Endpoint,例如MinIO、私有S3等),并提供靜態訪問密鑰。

  • 初始化 Elasticsearch 客戶端(支持跳過TLS證書驗證,適合開發環境)。

  • 調用 fetchS3Files,正式開始批量導入S3文件元數據到ES。


特別注意:

  • InsecureSkipVerify: true 表示 跳過SSL證書校驗,這個設置在生產環境是不安全的,一般僅用于開發測試。

  • 每導入一個S3對象,都會立即 Refresh 索引,確保數據立刻可搜索,但也會增加ES壓力,批量模式可以更高效。

  • 如果S3里文件特別多,可以考慮加并發處理或限制速率,否則會慢。


總結一句話:

這段程序實現了 自動同步S3文件列表到Elasticsearch索引,方便對存儲桶中的文件進行快速搜索和查詢

package mainimport ("bytes""context""encoding/json""fmt""github.com/aws/aws-sdk-go-v2/aws""github.com/aws/aws-sdk-go-v2/config""github.com/aws/aws-sdk-go-v2/credentials""github.com/aws/aws-sdk-go-v2/service/s3""github.com/elastic/go-elasticsearch/v8""github.com/elastic/go-elasticsearch/v8/esapi""gopkg.in/ini.v1""log""crypto/tls""net/http""time"
)type S3Config struct {BucketName  stringAccessKey   stringSecretKey   stringEndpointURL string
}type ESConfig struct {Host       stringUser       stringPass       stringIndexName  stringSearchType string
}func readConfig() (S3Config, ESConfig) {cfg, err := ini.Load("config.ini")if err != nil {log.Fatalf("無法讀取配置文件: %v", err)}s3Cfg := S3Config{BucketName:  cfg.Section("s3").Key("bucket_name").String(),AccessKey:   cfg.Section("s3").Key("access_key").String(),SecretKey:   cfg.Section("s3").Key("secret_key").String(),EndpointURL: cfg.Section("s3").Key("endpoint_url").String(),}esCfg := ESConfig{Host:       cfg.Section("elasticsearch").Key("host").String(),User:       cfg.Section("elasticsearch").Key("user").String(),Pass:       cfg.Section("elasticsearch").Key("password").String(),IndexName:  cfg.Section("elasticsearch").Key("index_name").String(),SearchType: cfg.Section("elasticsearch").Key("search_type").String(),}return s3Cfg, esCfg
}func getS3ETag(s3Client *s3.Client, bucketName, fileKey string) string {resp, err := s3Client.HeadObject(context.TODO(), &s3.HeadObjectInput{Bucket: aws.String(bucketName),Key:    aws.String(fileKey),})if err != nil {log.Printf("獲取 %s 的ETag失敗: %v", fileKey, err)return ""}etag := aws.ToString(resp.ETag)if len(etag) > 0 && etag[0] == '"' && etag[len(etag)-1] == '"' {etag = etag[1 : len(etag)-1]}return etag
}func fetchS3Files(s3Client *s3.Client, esClient *elasticsearch.Client, bucketName, indexName string) {paginator := s3.NewListObjectsV2Paginator(s3Client, &s3.ListObjectsV2Input{Bucket: aws.String(bucketName),})for paginator.HasMorePages() {page, err := paginator.NextPage(context.TODO())if err != nil {log.Printf("獲取S3文件列表頁失敗: %v", err)continue}for _, obj := range page.Contents {fileKey := aws.ToString(obj.Key)log.Printf("導入索引:",fileKey)fileSize := aws.ToInt64(obj.Size)lastModified := obj.LastModifiedstorageClass := string(obj.StorageClass) // 修復點etag := getS3ETag(s3Client, bucketName, fileKey)fileData := map[string]interface{}{"file_key":      fileKey,"file_size":     fileSize,"last_modified": lastModified,"storage_class": storageClass,"etag":          etag,}fileDataJSON, err := json.Marshal(fileData)if err != nil {log.Printf("將文件數據轉換為JSON失敗: %v", err)continue}req := esapi.IndexRequest{Index:   indexName,Body:    bytes.NewReader(fileDataJSON), // 修復點Refresh: "true",}resp, err := req.Do(context.TODO(), esClient)if err != nil {log.Printf("將文件數據索引到Elasticsearch失敗: %v", err)continue}defer resp.Body.Close()}}fmt.Println("S3 文件索引完成")
}func main() {s3Cfg, esCfg := readConfig()customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {return aws.Endpoint{URL:               s3Cfg.EndpointURL,SigningRegion:     "us-east-1", // 替換為你的實際regionHostnameImmutable: true,}, nil})awsCfg, err := config.LoadDefaultConfig(context.TODO(),config.WithRegion("us-east-1"), // 替換為你的實際regionconfig.WithEndpointResolverWithOptions(customResolver),config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(s3Cfg.AccessKey,s3Cfg.SecretKey,"",)),)if err != nil {log.Fatalf("無法加載S3配置: %v", err)}s3Client := s3.NewFromConfig(awsCfg)esCfgOptions := elasticsearch.Config{Addresses: []string{esCfg.Host},Username:  esCfg.User,Password:  esCfg.Pass,Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true, // ?? 跳過證書校驗(不安全,僅限開發)},ResponseHeaderTimeout: 10 * time.Second,},}esClient, err := elasticsearch.NewClient(esCfgOptions)if err != nil {log.Fatalf("無法創建Elasticsearch客戶端: %v", err)}fetchS3Files(s3Client, esClient, s3Cfg.BucketName, esCfg.IndexName)
}

?配置文件config.ini

[elasticsearch]
host = https://localhost:9200
user = elastic
password = U********uq
index_name = jyzx_s3_files
search_type = wildcard[s3]
bucket_name = fzsjyzx
access_key = V4*****6DB
secret_key = lHdmyi5*********UjlS
endpoint_url = http://172.20.1.18:7480/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79034.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 查看用戶信息

在 Git 中查看用戶信息是一項常見的任務,可以幫助你確認當前倉庫的配置或全局的 Git 配置是否正確設置。你可以通過多種方式來查看這些信息。 查看全局用戶信息 全局用戶信息是應用于所有 Git 倉庫的默認設置。要查看全局用戶信息,可以使用以下命令&am…

制作JDK17 arm64基礎鏡像,解決字體安裝問題

1、下載jdk17 arm64的安裝包 官網下載地址 2、編寫Dockerfile 圖形驗證碼生成需要使用到相關字體,所以基礎鏡像把字體相關也安裝上。 # 基礎鏡像 FROM arm64v8/centos:8.4.2105MAINTAINER hqh# 換源 RUN sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/…

人工智能數學基礎(三):微積分初步

微積分作為數學的重要分支,為人工智能的發展提供了堅實的理論基礎。從理解數據的變化趨勢到優化模型參數,微積分的應用貫穿其中。本文將深入探討微積分的核心概念,并結合 Python 編程實例,助力大家輕松掌握這些關鍵知識點。資源綁…

區塊鏈密碼學核心

文章目錄 概要1. 基礎密碼學哈希函數(Hash Function)對稱加密與非對稱加密數字簽名(Digital Signature)密鑰管理 2. 區塊鏈專用密碼學技術零知識證明(Zero-Knowledge Proof, ZKP)同態加密(Homom…

Java后端開發day39--方法引用

(以下內容全部來自上述課程) 1.1 含義 把已經有的方法拿過來用,當作函數式接口中抽象方法的方法體。 已經有的方法:可以是Java自己寫的,也可以是第三方的。 示例語句: ::是方法引…

目前市面上知名的數據采集器

程序員愛自己動手打造一切,但這樣離錢就會比較遠。 市面上知名的數據采集工具 數據采集工具(也稱為網絡爬蟲或數據抓取工具)在市場上有很多選擇,以下是目前比較知名和廣泛使用的工具分類介紹: 一、開源免費工具 Scra…

TP5兼容達夢國產數據庫

1.首先數據庫安裝,部署時需配置大小寫不敏感 2.安裝PHP達夢擴展,一定要是對應版本(兼容操作系統)的擴展,否則會出現各種報錯。參考官方文檔:https://eco.dameng.com/document/dm/zh-cn/app-dev/php_php_new…

《解鎖圖像“高清密碼”:超分辨率重建之路》

在圖像的世界里,高分辨率意味著更多細節、更清晰的畫面,就像用高清望遠鏡眺望遠方,一切都纖毫畢現。可現實中,我們常被低分辨率圖像困擾,模糊的監控畫面、老舊照片里難以辨認的面容……不過別擔心,圖像超分…

整合 CountVectorizer 和 TfidfVectorizer 繪制詞云圖

本文分別整合 CountVectorizer 和 TfidfVectorizer 繪制詞云圖 ? CountVectorizer CountVectorizer 是 scikit-learn 中用于 文本特征提取 的一個工具,它的主要作用是將一組文本(文本集合)轉換為詞頻向量(Bag-of-Words&#xf…

Linux 用戶管理

用戶管理是 Linux 系統管理中的重要組成部分,它涉及到用戶和用戶組的創建、刪除、修改以及權限分配等操作。以下是關于用戶和用戶組管理的詳細說明: 一、用戶和用戶組的概念 (一)用戶(User) 用戶是系統中…

【HTTP/2和HTTP/3的應用現狀:看不見的革命】

HTTP/2和HTTP/3的應用現狀:看不見的革命 實際上,HTTP/2和HTTP/3已經被眾多著名網站廣泛采用,只是這場革命對普通用戶來說是"無形"的。讓我們揭開這個技術變革的真相。 著名網站的HTTP/2和HTTP/3采用情況 #mermaid-svg-MtfrNDo5DG…

青少年編程與數學 02-018 C++數據結構與算法 16課題、貪心算法

青少年編程與數學 02-018 C數據結構與算法 16課題、貪心算法 一、貪心算法的基本概念定義組成部分 二、貪心算法的工作原理三、貪心算法的優點四、貪心算法的缺點五、貪心算法的應用實例(一)找零問題問題描述:貪心策略:示例代碼&a…

UE5 Set actor Location和 Set World Location 和 Set Relative Location 的區別

在 Unreal Engine 的藍圖里,SetRelativeLocation、SetWorldLocation 和 SetActorLocation 三個節點雖然都能改變物體位置,但作用對象和坐標空間(Coordinate Space)不同: 1. SetActorLocation 作用對象:整個…

VINS-FUSION:跑通手機錄制數據

文章目錄 📚簡介🚀手機錄制數據🚀跑通數據🔧啟動rviz🔧啟動配置🔧播放rosbag🎯跑通結果 📚簡介 利用智能手機的 攝像頭IMU 采集數據,并在 VINS-Fusion(視覺慣…

Spring AI在大模型領域的趨勢場景題深度解析

Spring AI在大模型領域的趨勢場景題深度解析 在互聯網大廠Java求職者的面試中,經常會被問到關于Spring AI在大模型領域的趨勢場景的相關問題。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官:馬架構,歡迎來到我們…

MySQL數據庫全面詳解:從基礎到高級應用

一、數據存儲概述 在計算機系統中,數據可以存儲在多種形式中: 變量:程序中最基本的數據存儲單元 元組:不可變的序列類型,常用于函數返回多個值 列表:有序可變集合,可存儲不同類型元素 字典&…

Redux和MobX有什么區別

Redux 和 MobX 都是用于 React 應用的全局狀態管理庫,但它們在設計理念、使用方式和適用場景等方面存在明顯的區別,下面為你詳細分析: 1. 設計理念 Redux:基于 Flux 架構,遵循單向數據流和純函數式編程的理念。狀態是…

WPF實現類似Microsoft Visual Studio2022界面效果及動態生成界面技術

WPF實現類似VS2022界面效果及動態生成界面技術 一、實現類似VS2022界面效果 1. 主窗口布局與主題 <!-- MainWindow.xaml --> <Window x:Class"VsStyleApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x…

備份服務器,備份服務器數據有哪些方法可以實現?

服務器承載著企業核心業務數據與關鍵應用&#xff0c;數據丟失或業務中斷可能帶來災難性后果。因此&#xff0c;構建一套科學、可靠的服務器數據備份體系至關重要。當前&#xff0c;服務器數據備份方法可根據技術架構、存儲介質及恢復需求進行多維劃分。根據不同場景、預算和技…

前端基礎——5、CSS border屬性與漸變色(詳解與實戰)

前端基礎——5、CSS border屬性與漸變色詳解 CSS border屬性與漸變色&#xff08;詳解與實戰&#xff09;一、border屬性全面解析1. 基礎三屬性2. 復合寫法3. 高級特性附加.border-style詳解使用示例效果&#xff1a; CSS 漸變終極指南&#xff1a;線性漸變與徑向漸變的深度解析…