分享方式:


編製 Blob 和檔案的索引,以產生多個搜尋文件

適用於Blob 索引子檔案索引子

依預設,索引子會將 Blob 或檔案的內容視為單一搜尋文件。 如果您想要在搜尋索引中使用更精細的表示法,您可以設定 parsingMode 值,從一個 Blob 或檔案建立多個搜尋文件。 產生許多搜尋文件的 parsingMode 值,包括 (CSV 的) delimitedText,以及 jsonArray 或 (JSON 的) jsonLines

當您使用上述任何剖析模式,出現的新搜尋文件必須具有唯一的文件索引鍵,而且判斷該值的來源的問題。 父 Blob 在 metadata_storage_path property 中格式至少有一個唯一值,但如果父 Blob 將該值提供給多個搜尋文件,則索引鍵將不再是唯一。

為解決此問題,Blob 索引子會產生 AzureSearch_DocumentKey,可唯一識別從單一 Blob 父代建立的每個子搜尋文件。 本文將說明此功能的運作方式。

一對多文件索引鍵

索引中的每個文件都是依據文件索引鍵進行唯一識別。 如果未指定剖析模式,且如果搜尋文件索引鍵的索引子定義中沒有明確的欄位對應,則 Blob 索引子會自動將 metadata_storage_path property 對應為文件索引鍵。 此預設對應可確保每個 Blob 都會顯示為不同的搜尋文件,並儲存您建立此欄位對應的步驟 (通常只有具有相同名稱和類型的欄位會自動對應)。

在一對多搜尋文件的情況中,無法使用以 metadata_storage_path property 為基礎的隱含文件索引鍵。 作為因應措施,Azure AI 搜尋服務可針對從 Blob 擷取的每個實體產生文件密鑰。 產生的索引鍵會命名為 AzureSearch_DocumentKey,並且會新增至每個搜尋文件。 索引子會追蹤由每個 Blob 建立的「許多文件」,並在來源資料隨著時間變更時,以搜尋索引的更新為目標。

根據預設,當未指定索引鍵索引欄位的明確欄位對應時,會使用 base64Encode 欄位對應函式,與 AzureSearch_DocumentKey 進行對應。

範例

假設索引定義具有下列欄位:

  • id
  • temperature
  • pressure
  • timestamp

您的 Blob 容器具有具有下列結構的 Blob:

Blob1.json

{ "temperature": 100, "pressure": 100, "timestamp": "2024-02-13T00:00:00Z" }
{ "temperature" : 33, "pressure" : 30, "timestamp": "2024-02-14T00:00:00Z" }

Blob2.json

{ "temperature": 1, "pressure": 1, "timestamp": "2023-01-12T00:00:00Z" }
{ "temperature" : 120, "pressure" : 3, "timestamp": "2022-05-11T00:00:00Z" }

當您建立索引子,並將 parsingMode 設定為 jsonLines (而不指定索引鍵欄位的任何明確欄位對應) 時,將會隱含地套用下列對應。

{
    "sourceFieldName" : "AzureSearch_DocumentKey",
    "targetFieldName": "id",
    "mappingFunction": { "name" : "base64Encode" }
}

此設定會導致文件索引鍵變得模稜兩可,類似於下圖 (為了簡潔起見,縮短為 base64 的已編碼識別碼)。

識別碼 溫度 壓力 timestamp
aHR0 ...YjEuanNvbjsx 100 100 2024-02-13T00:00:00Z
aHR0 ...YjEuanNvbjsy 33 30 2024-02-14T00:00:00Z
aHR0 ...YjIuanNvbjsx 1 1 2023-01-12T00:00:00Z
aHR0 ...YjIuanNvbjsy 120 3 2022-05-11T00:00:00Z

索引鍵欄位的自訂欄位對應

假設索引定義與上一個範例相同,您的 Blob 容器應有具下列結構的 Blob:

Blob1.json

recordid, temperature, pressure, timestamp
1, 100, 100,"2024-02-13T00:00:00Z" 
2, 33, 30,"2024-02-14T00:00:00Z" 

Blob2.json

recordid, temperature, pressure, timestamp
1, 1, 1,"20123-01-12T00:00:00Z" 
2, 120, 3,"2022-05-11T00:00:00Z" 

當您使用 delimitedText parsingMode 建立索引子時,可能會覺得將欄位對應函式設定為索引鍵欄位十分自然,如下所示:

{
    "sourceFieldName" : "recordid",
    "targetFieldName": "id"
}

不過,此對應「不會」在索引中顯示四份文件,因為 recordid 欄位在「Blob 之間」不是唯一項目。 因此,建議您針對「一對多」剖析模式,使用從 AzureSearch_DocumentKey 屬性套用至索引鍵索引欄位的隱含欄位對應。

如果您想要設定明確的欄位對應,請確定所有 Blob 中每個個別實體的 sourceField 都不同。

注意

AzureSearch_DocumentKey 用來確保每個擷取實體唯一性的方法可能有所變更,因此您不應該依賴其值來滿足應用程式需求。

指定您資料中的索引鍵欄位

假設索引定義與上一個範例相同,且 parsingMode 設定為 jsonLines,未指定任何明確的欄位對應,則對應會類似於第一個範例,您的 Blob 容器應該具有下列結構的 Blob:

Blob1.json

id, temperature, pressure, timestamp
1, 100, 100,"2024-02-13T00:00:00Z" 
2, 33, 30,"2024-02-14T00:00:00Z"

Blob2.json

id, temperature, pressure, timestamp
1, 1, 1,"2023-01-12T00:00:00Z" 
2, 120, 3,"2022-05-11T00:00:00Z" 

請注意,每個文件都包含 id 欄位,該欄位在索引中定義為 key 欄位。 在這種情況下,即使會產生在文件內唯一的 AzureSearch_DocumentKey,也不會當成文件的「索引鍵」使用。 相反地,id 欄位的值將會對應至 key 欄位

與上一個範例類似,此對應不會在索引中顯示四份文件,因為 id 欄位在「Blob 之間」並不是唯一值。 在此情況下,任何指定 id 的 json 項目都會在現有文件上產生合併,而不是上傳新文件,而且索引的狀態會反映已指定 id 的最新讀取項目。

下一步

如果您還不熟悉 Blob 索引的基本結構和工作流程,您應該先檢閱使用 Azure AI 搜尋服務編製 Azure Blob 儲存體的索引。 如需不同 Blob 內容類型剖析模式的詳細資訊,請檢閱下列文章。