1. 程式人生 > 實用技巧 >Azure Blob 檔案索引檢索查詢 -- Azure Blob Indexing 篇

Azure Blob 檔案索引檢索查詢 -- Azure Blob Indexing 篇

前面我們為大家介紹了Azure Blob 檔案索引檢索查詢的幾個典型場景,本文為大家來介紹一下 Azure Blob Indexing 的方案實現。我們來回顧一下架構圖,在 Azure Blob 中原生提供了 Blob Indexing 功能,支援典型的 Key Value 檢索查詢,如果使用者對於元資料的檢索查詢需求是完全匹配,Blob Indexing 是一個非常好的方式,客戶不需要額外借助其他外部系統來構建檔案查詢索引。雖然 Blob Indexing 的方式雖然簡單易用,但也有場景的限制,比如上面所述的模糊查詢是無法通過 Blob Indexing 來做到的,目前 Blob Indexing 對於構建的 Key Value 都是按照 String 字元組資料型別來處理的,在查詢檢索時除支援等於匹配外也支援大於小於等匹配符,但由於 Value 按照字串儲存,所以對於大小匹配符的支援按照字母排序來進行比較,對於數字,日期等型別資料也是按照字串來處理,所以對於大小匹配符的支援就會受限,同時對於數字型別資料的比較只支援第一個數字的比較(比如 11 和 12 比較,> 11 結果中不會有 12),如果使用者有數字比較的場景,建議客戶可以把數字拆分成多個0-9 位,建立多個 Key Value 索引來實現(需要注意目前 Azure Blob 單個檔案上最多支援 10 個 Key Value)。所以如果使用者希望對元資料做模糊查詢,可以考慮通過RedisSearch/Elastic/Azure Search 來構建外部查詢索引,藉助外部索引強大的搜尋能力來進行支援,其中 RedisSearch 和 Azure Research 微軟提供第一方的 PaaS 服務,可以方便使用者快速構建查詢索引平臺。Azure Search 作為微軟自研的搜尋產品,其對於微軟第一方的服務原生整合是最大的優勢,客戶可以通過簡單的點選即可將 Blob 的資料資訊匯入到 Azure Search 中,另外 Azure Search 內的 AI 賦能可以增加對檔案中富媒體內容的支援,這部分我們放在後面檔案內容檢索查詢部分給大家單獨介紹。RedisSearch/ElasticSearch 都是開源的索引查詢產品,其中 RedisSearch 在微軟雲上的 Redis Enterprise Tier 已經原生支援,客戶可以通過託管 PaaS 的方式快速建立使用,ElasticSearch 客戶可以通過 Marketplace 購買使用。無論時 Azure Blob Indexing 還是外部查詢索引系統(RedisSearch/ElasticSearch),使用者都需要來實時的維護索引資訊,當 Blob 檔案進行增刪改動作時,相應的需要對索引資料進行變更。整個系統架構的實現可以通過 EventGrid 來監聽 Blob 的增刪改動作,然後觸發程式碼來進行索引的更新。對於索引變更的管理邏輯程式碼可以通過託管在 Azure Function 服務中,快速的實現事件觸發的邏輯。使用者側的查詢可以通過 Webapp 構建前端 GUI 層為使用者提供訪問。

目前 Azure Blob Indexing 功能處於 Preview 預覽階段,感興趣的使用者可以在全球版 Azure 的 Canada Central,Canada East, France Central 和 France South 建立。建立時使用者需要選擇 General Purpose V2 Storage Account(且不開啟 hierachical namespace),具體船艦過程大家可以訪問連結,這裡我們就不做贅述。在整個方案中,我們需要通過程式碼來維護 Blob Indexing 中的索引資料,下面我們來看一下程式碼的實現。

資料準備: 示例中通過本地的書籍資訊樣本資料為大家進行介紹,原資料是一個 CSV 檔案,檔案中包含如下書籍資訊

執行環境準備:示例中採用 python 作為示例程式碼,客戶需要環境中安裝azure-storage-blob 依賴包,並從 Azure Portal 中讀取 Blob 服務的連結字串

from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
import csv

AZURE_STORAGE_CONNECTION_STRING="Input_your_blob_connectionstring_here"

# Create Blob Client
blob_service_client = BlobServiceClient.from_connection_string(AZURE_STORAGE_CONNECTION_STRING)

# Create a unique name for the container container_name = "indexdemo" # Create the container container_client = blob_service_client.create_container(container_name)

資料索引:通過讀取 CSV file 中的資料資訊,模擬建立 Blob 並將作者,書名,發行商和發行時間作為索引資料。

data = "demo"

with open('demobookdataset.csv', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
            continue

        # Create a blob client using the local file name as the name for the blob
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=str(line_count))

        # Upload blob Data
        blob_client.upload_blob(data)

        # Preparing Index Key Value Data
        tagmark = {}
        tagmark["author"] = row["authors"]
        tagmark["title"] = row["title"]
        tagmark["publisher"] = row["publisher"]
        tagmark["publicationdate"] = row["publication_date"]

        # Set Blob Indexing
        blob_client.set_blob_tags(tagmark)
        line_count += 1

資料檢索查詢:示例中通過以索引中 author 作為查詢值進行檢索查詢驗證,需要注意在 Filter 的查詢語句編寫語法上需要按照規範進行編寫,可以參考查詢語法進行定義。

# Full loop all the documents index
with open('demobookdataset.csv', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            #print(f'Column names are {", ".join(row)}')
            line_count += 1
            continue
        filter = "\"author\" = '" + row["authors"] + "'"
        result = blob_service_client.find_blobs_by_tags(filter)
        for item in result:
            print(item)

通過上述示例我們瞭解到 Blob Indexing 的程式碼實現,大家可以按照自己喜好的開發語言進行開發,整個方案關於 EventGrid, Function 的整合這裡不再贅述,感興趣的小夥伴,可以參考我之前的部落格Azure NSG Flow Log 引發的自嗨