Azure AI 搜尋服務中的索引投影

重要

根據增補使用規定,索引投影為公開預覽版。 其可透過 Azure 入口網站、2023-10-10-01-Preview REST API,以及已更新為包含此功能的 Beta 用戶端程式庫取得。

「索引投影」是技能集定義的元件,其會定義次要索引的形狀,支援一對多索引模式,其中來自擴充管線的內容可將多個索引設為目標。

索引投影會採用擴充管線所產生的 AI 擴充內容,並在您的搜尋服務上將其編製成次要索引 (與索引子預設的目標索引不同)。 索引投影也可讓您在編製資料索引之前重塑資料,這種方式可獨特地允許您將擴充項目陣列分隔成目標索引中的多個搜尋文件,也稱為「一對多」索引編製。 「一對多」索引編製對於資料區塊化案例很有用,其中您可能需要一個主要索引用於未區塊化內容,以及一個次要索引用於區塊化內容。

如果過去已使用認知技能,您已知道「技能集」會建立擴充內容。 技能會讓文件經過叫用自動轉換的一系列擴充,例如辨識實體或翻譯文字。 根據預設,技能集內處理的一份文件會對應至搜尋索引中的單一文件。 這表示,如果您執行輸入文字的區塊化,然後在每個區塊上執行擴充,則透過 outputFieldMappings 對應時,索引中的結果是所產生擴充的陣列。 使用索引投影,您可以定義內容,將擴充資料的每個區塊對應至自己的搜尋文件。 這可讓您將文件擴充資料的一對多對應套用至搜尋索引。

索引投影定義

索引投影是在技能集定義內定義的,而且主要定義為選取器的陣列,其中每個選取器都會對應至搜尋服務上的不同目標索引。 每個選取器都需要下列參數做為其定義的一部分:

  • targetIndexName:搜尋服務上的索引名稱,而索引投影資料會在該服務中編製索引。
  • parentKeyFieldName:目標索引中包含父文件索引鍵值的欄位名稱。
  • sourceContext:定義要以哪種粒度將資料對應至個別搜尋文件的擴充註釋。 如需詳細資訊,請參閱技能內容和輸入註釋語言
  • mappings:擴充資料與搜尋索引中欄位的對應陣列。 每個對應都包含:
    • name:搜尋索引中資料索引應編製至其中的欄位名稱,
    • source:應該從中提取資料的擴充註釋路徑。

每個 mapping 也可以使用選用的 sourceContextinputs 欄位以遞迴方式定義資料,類似於知識存放區Shaper 技能。 這些參數可讓您將資料塑造成要在搜尋索引中類型為 Edm.ComplexType 的欄位中編製索引。

targetIndexName 參數中定義的索引具有下列需求:

  • 必須已在搜尋服務上建立,然後才能建立包含索引投影定義的技能集。
  • 必須包含名稱在 parentKeyFieldName 參數中定義的欄位。 此欄位的類型必須是 Edm.String不能是索引鍵欄位,而且必須將可篩選設定為 true。
  • 索引鍵欄位必須已將可搜尋設定為 true,並使用 keyword 分析器來定義。
  • 必須具有針對 mappings 中定義的每個 name 定義的欄位,這兩者都不能是索引鍵欄位。

以下是索引投影定義的範例承載,您可以用來透過分割技能投影個別頁面輸出,做為搜尋索引中自己的文件。

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "myTargetIndex",
            "parentKeyFieldName": "ParentKey",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*"
                }
            ]
        }
    ]
}

處理父文件

因為索引投影會有效地為每個透過技能集執行的「父」文件產生「子」文件,所以您也有下列如何處理「父」文件索引編製的選項。

  • 若要將父文件和子文件保留在個別的索引中,您只需確保索引子定義的 targetIndexName 與索引投影選取器中定義的 targetIndexName 不同即可。

  • 若要將父文件和子文件編製成相同的索引,您必須確定目標索引的結構描述可以同時使用您在索引子定義中定義的 fieldMappingsoutputFieldMappings,以及索引投影選取器中的 mappings。 然後,您只會為索引子定義和索引投影選取器提供相同的 targetIndexName

  • 若要忽略父文件並僅編製子文件的索引,您仍然需要在索引子定義中提供 targetIndexName (您可以只提供您為索引投影選取器所提供的同一個)。 然後,在您的 selectors 定義旁定義個別的 parameters 物件,並將 projectionMode 索引鍵設定為 skipIndexingParentDocuments,如下所示:

    "indexProjections": {
        "selectors": [
            ...
        ],
        "parameters": {
            "projectionMode": "skipIndexingParentDocuments"
        }
    }
    

REST API 版本 2023-10-01-Preview 可以用來透過新增至技能集來建立索引投影。

內容生命週期

如果索引子資料來源支援變更追蹤和刪除偵測,則編製索引流程可以同步主要和次要索引以挑選這些變更。

每次您執行索引子和技能集時,如果技能集或基礎來源資料變更,索引投影就會隨之更新。 索引子所挑選的任何變更都會透過擴充流程傳播到索引中的投影,以確保投影的資料是原始資料來源中內容的目前形式。

注意

雖然您可以使用索引推送 API,手動編輯投影文件中的資料,但假設來源資料中的文件已更新,則任何編輯都會在下次叫用管線時遭到覆寫。

投影索引鍵值

每個索引投影文件都包含索引子產生的唯一識別索引鍵,以確保唯一性,並允許變更和刪除追蹤正常運作。 此索引鍵包含下列區段:

  • 保證唯一性的隨機雜湊。 如果在索引子執行之間更新父文件,此雜湊就會變更。
  • 父文件的索引鍵。
  • 擴充註釋路徑,可識別從中產生文件的內容。

例如,如果您將索引鍵值為 "123" 的父文件分割成四個頁面,然後每個頁面都是透過索引投影來投影為自己的文件,則第三頁文字的索引鍵看起來會像 "01f07abfe7ed_123_pages_2"。 如果接著更新父文件以新增第五頁,則第三頁的新索引鍵可能是例如 "9d800bdacc0e_123_pages_2",因為隨機雜湊值會在索引子執行之間變更,即使其餘的投影資料沒有變更也一樣。

變更或新增

如果父文件變更,以致投影索引文件內的資料變更 (例如,如果在特定頁面中變更某個字組,但沒有加入全新的頁面),則會更新該特定投影目標索引中的資料以反映該變更。

如果父文件變更,以致有了之前沒有的新投影子文件 (例如,如果已將一或多頁的文字新增至文件),則下次索引子執行時,就會加入這些新的子文件。

在這兩種情況下,所有投影文件都會更新為在其索引鍵中具有新的雜湊值,不論其特定內容是否已更新。

刪除

如果父文件變更,以致索引投影所產生的子文件不再存在 (例如,如果文字縮短,因此區塊比以前少),則會刪除搜尋索引中的對應子文件。 剩餘的子文件也會更新其索引鍵以包含新的雜湊值,即使其內容未以其他方式變更也一樣。

如果已從資料來源中完全刪除父文件,則只有在資料來源定義上定義的 dataDeletionDetectionPolicy 偵測到刪除時,才會刪除對應的子文件。 如果您沒有設定 dataDeletionDetectionPolicy,而且需要從資料來源中刪除父文件,則若不再需要子文件,您應該手動將其刪除。