Mapowanie wzbogaconych danych wyjściowych na pola w indeksie wyszukiwania w usłudze Azure AI Search

Etapy indeksatora

W tym artykule wyjaśniono, jak skonfigurować mapowania pól wyjściowych, zdefiniować ścieżkę danych między strukturami danych w pamięci utworzonymi podczas przetwarzania zestawu umiejętności i polami docelowymi w indeksie wyszukiwania. Mapowanie pól wyjściowych jest definiowane w indeksatorze i ma następujące elementy:

"outputFieldMappings": [
  {
    "sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],

W przeciwieństwie do fieldMappings definicji, która mapuje ścieżkę między dwiema fizycznymi strukturami danych, outputFieldMappings definicja mapuje wzbogacanie w pamięci na pola w indeksie wyszukiwania.

Mapowania pól wyjściowych są wymagane, jeśli indeksator ma dołączony zestaw umiejętności, który tworzy nowe informacje, takie jak tłumaczenie tekstu lub wyodrębnianie kluczowych fraz. Podczas wykonywania indeksatora informacje generowane przez sztuczną inteligencję istnieją tylko w pamięci. Aby utrwały te informacje w indeksie wyszukiwania, należy poinformować indeksator, gdzie mają być wysyłane dane.

Mapowania pól wyjściowych mogą być również używane do pobierania określonych węzłów w typie złożonym dokumentu źródłowego. Na przykład możesz chcieć po prostu "FullName/LastName" we właściwości "FullName" z wieloma częściami. Jeśli nie potrzebujesz pełnej złożonej struktury, możesz spłaszczać poszczególne węzły w zagnieżdżonych strukturach danych, a następnie użyć mapowania pól wyjściowych, aby wysłać dane wyjściowe do kolekcji ciągów w indeksie wyszukiwania.

Mapowania pól wyjściowych mają zastosowanie do:

  • Zawartość w pamięci utworzona przez umiejętności lub wyodrębniona przez indeksator. Pole źródłowe jest węzłem w wzbogaconym drzewie dokumentów.

  • Indeksy wyszukiwania. Jeśli wypełniasz magazyn wiedzy, użyj projekcji do konfiguracji ścieżki danych. Jeśli wypełniasz pola wektorów, mapowania pól wyjściowych nie są używane.

Mapowania pól wyjściowych są stosowane po wykonaniu zestawu umiejętności lub po pęknięciu dokumentu, jeśli nie ma skojarzonego zestawu umiejętności.

Definiowanie mapowania pól wyjściowych

Mapowania pól wyjściowych są dodawane do outputFieldMappings tablicy w definicji indeksatora, zwykle umieszczane po tablicy fieldMappings . Mapowanie pól wyjściowych składa się z trzech części.

"fieldMappings": []
"outputFieldMappings": [
  {
    "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],
Właściwości opis
sourceFieldName Wymagany. Określa ścieżkę do wzbogaconej zawartości. Przykładem może być /document/content. Zobacz Temat Wzbogacanie odwołań w zestawie umiejętności usługi Azure AI Search, aby zapoznać się ze składnią ścieżki i przykładami.
targetFieldName Opcjonalny. Określa pole wyszukiwania, które odbiera wzbogaconą zawartość. Pola docelowe muszą być prostymi polami lub kolekcjami najwyższego poziomu. Nie może to być ścieżka do pola podrzędnego w typie złożonym. Jeśli chcesz pobrać określone węzły w złożonej strukturze, możesz spłaszczać poszczególne węzły w pamięci, a następnie wysłać dane wyjściowe do kolekcji ciągów w indeksie.
mappingFunction Opcjonalny. Dodaje dodatkowe przetwarzanie udostępniane przez funkcje mapowania obsługiwane przez indeksatory. W przypadku węzłów wzbogacania kodowanie i dekodowanie to najczęściej używane funkcje.

Do definiowania mapowań pól wyjściowych można użyć interfejsu API REST lub zestawu Azure SDK.

Napiwek

Indeksatory utworzone przez kreatora importu danych obejmują mapowania pól wyjściowych generowanych przez kreatora. Jeśli potrzebujesz przykładów, uruchom kreatora w źródle danych, aby wyświetlić renderowaną definicję.

Użyj polecenia Create Indexer (REST) lub Update Indexer (REST), dowolnej wersji interfejsu API.

W tym przykładzie dodano jednostki i etykiety tonacji wyodrębnione z właściwości zawartości obiektu blob do pól w indeksie wyszukiwania.

PUT https://[service name].search.windows.net/indexers/myindexer?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
    "name": "myIndexer",
    "dataSourceName": "myDataSource",
    "targetIndexName": "myIndex",
    "skillsetName": "myFirstSkillSet",
    "fieldMappings": [],
    "outputFieldMappings": [
        {
            "sourceFieldName": "/document/content/organizations/*/description",
            "targetFieldName": "descriptions",
            "mappingFunction": {
                "name": "base64Decode"
            }
        },
        {
            "sourceFieldName": "/document/content/organizations",
            "targetFieldName": "orgNames"
        },
        {
            "sourceFieldName": "/document/content/sentiment",
            "targetFieldName": "sentiment"
        }
    ]
}

Dla każdego mapowania pól wyjściowych ustaw lokalizację danych w wzbogaconym drzewie dokumentów (sourceFieldName) oraz nazwę pola zgodnie z odwołaniem w indeksie (targetFieldName). Przypisz wszystkie funkcje mapowania potrzebne do przekształcenia zawartości pola przed zapisaniem go w indeksie.

Spłaszczanie złożonych struktur do kolekcji ciągów

Jeśli dane źródłowe składają się z zagnieżdżonego lub hierarchicznego kodu JSON, nie można używać mapowań pól do konfigurowania ścieżek danych. Zamiast tego indeks wyszukiwania musi odzwierciedlać strukturę danych źródłowych dla każdego poziomu dla pełnego importu.

W tej sekcji przedstawiono proces importowania, który tworzy odbicie jednego do jednego złożonego dokumentu po stronach źródłowych i docelowych. Następnie używa tego samego dokumentu źródłowego do zilustrowania pobierania i spłaszczania poszczególnych węzłów do kolekcji ciągów.

Oto przykład dokumentu w usłudze Azure Cosmos DB z zagnieżdżonym kodem JSON:

{
   "palette":"primary colors",
   "colors":[
      {
         "name":"blue",
         "medium":[
            "acrylic",
            "oil",
            "pastel"
         ]
      },
      {
         "name":"red",
         "medium":[
            "acrylic",
            "pastel",
            "watercolor"
         ]
      },
      {
         "name":"yellow",
         "medium":[
            "acrylic",
            "watercolor"
         ]
      }
   ]
}

Jeśli chcesz w pełni zaindeksować powyższy dokument źródłowy, należy utworzyć definicję indeksu, w której nazwy pól, poziomy i typy są odzwierciedlane jako typ złożony. Ponieważ mapowania pól nie są obsługiwane w przypadku typów złożonych w indeksie wyszukiwania, definicja indeksu musi odzwierciedlać dokument źródłowy.

{
  "name": "my-test-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true},
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "colors", "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "name",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "medium",
          "type": "Collection(Edm.String)",
          "searchable": true,
          "retrievable": true,
        }
      ]
    }
  ]
}

Oto przykładowa definicja indeksatora, która wykonuje import (zwróć uwagę, że nie ma mapowań pól i nie ma zestawu umiejętności).

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-test-index",

  "fieldMappings": [],
  "outputFieldMappings": []
}

Wynikiem jest następujący przykładowy dokument wyszukiwania podobny do oryginalnego w usłudze Azure Cosmos DB.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "colors": [
        {
          "name": "blue",
          "medium": [
            "acrylic",
            "oil",
            "pastel"
          ]
        },
        {
          "name": "red",
          "medium": [
            "acrylic",
            "pastel",
            "watercolor"
          ]
        },
        {
          "name": "yellow",
          "medium": [
            "acrylic",
            "watercolor"
          ]
        }
      ]
    }
  ]
}

Alternatywnym renderowaniem w indeksie wyszukiwania jest spłaszczenie poszczególnych węzłów w strukturze zagnieżdżonej źródła w kolekcji ciągów w indeksie wyszukiwania.

Aby wykonać to zadanie, musisz outputFieldMappings utworzyć mapowanie węzła w pamięci na kolekcję ciągów w indeksie. Mimo że mapowania pól wyjściowych mają zastosowanie głównie do danych wyjściowych umiejętności, można ich również użyć do adresowania węzłów po "pęknięciu dokumentu" , gdzie indeksator otwiera dokument źródłowy i odczytuje go do pamięci.

Poniżej przedstawiono przykładową definicję indeksu, używając kolekcji ciągów do odbierania spłaszczonej danych wyjściowych:

{
  "name": "my-new-flattened-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true },
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "color_names", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true },
    { "name": "color_mediums", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true}
  ]
}

Oto przykładowa definicja indeksatora, która umożliwia outputFieldMappings skojarzenie zagnieżdżonego kodu JSON z polami kolekcji ciągów. Zwróć uwagę, że pole źródłowe używa składni ścieżki dla węzłów wzbogacania, mimo że nie ma zestawu umiejętności. Wzbogacone dokumenty są tworzone w systemie podczas pękania dokumentów, co oznacza, że można uzyskać dostęp do węzłów w każdym drzewie dokumentów, o ile te węzły istnieją po pęknięciu dokumentu.

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-new-flattened-index",
  "parameters": {  },
  "fieldMappings": [   ],
  "outputFieldMappings": [
    {
       "sourceFieldName": "/document/colors/*/name",
       "targetFieldName": "color_names"
    },
    {
       "sourceFieldName": "/document/colors/*/medium",
       "targetFieldName": "color_mediums"
    }
  ]
}

Wyniki powyższej definicji są następujące. Uproszczenie struktury powoduje utratę kontekstu w tym przypadku. Nie ma już żadnych skojarzeń między danym kolorem a nośnikami, w których jest dostępna. Jednak w zależności od scenariusza wynik podobny do przedstawionego poniżej może być dokładnie tym, czego potrzebujesz.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "color_names": [
        "blue",
        "red",
        "yellow"
      ],
      "color_mediums": [
        "[\"acrylic\",\"oil\",\"pastel\"]",
        "[\"acrylic\",\"pastel\",\"watercolor\"]",
        "[\"acrylic\",\"watercolor\"]"
      ]
    }
  ]
}

Zobacz też