Mapowanie wzbogaconych danych wyjściowych na pola w indeksie wyszukiwania w usłudze Azure AI Search
W tym artykule wyjaśniono, jak skonfigurować mapowania pól wyjściowych, zdefiniować ścieżkę danych między danymi w pamięci wygenerowanymi podczas przetwarzania zestawu umiejętności i polami docelowymi w indeksie wyszukiwania. Podczas wykonywania indeksatora informacje generowane przez umiejętności istnieją tylko w pamięci. Aby utrwały te informacje w indeksie wyszukiwania, należy poinformować indeksator, gdzie mają być wysyłane dane.
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 dosłownymi polami źródłowymi i polami indeksu, outputFieldMappings
definicja mapuje wzbogacanie w pamięci na pola w indeksie wyszukiwania.
Wymagania wstępne
Indeksator, indeks, źródło danych i zestaw umiejętności.
Pola indeksu muszą być polami prostymi lub najwyższego poziomu. Nie można uzyskać danych wyjściowych do typu złożonego. Jeśli jednak masz typ złożony, możesz użyć definicji pola wyjściowego do spłaszczenia części typu złożonego i wysłać je do kolekcji w indeksie wyszukiwania.
Kiedy należy użyć mapowania pól wyjściowych
Mapowania pól wyjściowych są wymagane, jeśli indeksator ma dołączony zestaw umiejętności, który tworzy nowe informacje, które mają być w indeksie. Oto kilka przykładów:
- Wektory z umiejętności osadzania
- Optyczne rozpoznawanie znaków (OCR) z umiejętności obrazu
- Lokalizacje, organizacje lub osoby z umiejętności rozpoznawania jednostek
Mapowania pól wyjściowych mogą również służyć do:
Utwórz wiele kopii wygenerowanej zawartości (mapowania pól wyjściowych jeden do wielu).
Spłaszczaj typ złożony dokumentu źródłowego. Załóżmy na przykład, że dokumenty źródłowe mają złożony typ, taki jak adres wieloczęściowy, i chcesz tylko miasto. Mapowanie pól wyjściowych umożliwia spłaszczenie zagnieżdżonej struktury danych, a następnie użycie mapowania pól wyjściowych w celu wysłania danych wyjściowych do kolekcji ciągów w indeksie wyszukiwania.
Mapowania pól wyjściowych mają zastosowanie tylko do indeksów wyszukiwania. Jeśli wypełniasz magazyn wiedzy, użyj projekcji do konfiguracji ścieżki danych.
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.
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ć mapowania pól wyjściowych w indeksatorze.
Użyj metody Create Indexer lub Create lub Update Indexer lub równoważnej metody w zestawie Azure SDK. Oto przykład definicji indeksatora.
{ "name": "myindexer", "description": null, "dataSourceName": "mydatasource", "targetIndexName": "myindex", "schedule": { }, "parameters": { }, "fieldMappings": [], "outputFieldMappings": [], "disabled": false, "encryptionKey": { } }
Wypełnij tablicę,
outputFieldMappings
aby określić mapowania. Mapowanie pól składa się z trzech części."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. Jest
targetFieldName
to zawsze nazwa pola w indeksie wyszukiwania.Jest
sourceFieldName
to ścieżka do węzła w wzbogaconym dokumencie. To dane wyjściowe umiejętności. Ścieżka zawsze zaczyna się od /document, a jeśli indeksujesz z obiektu blob, drugi element ścieżki to /content. Trzeci element to wartość wygenerowana przez umiejętności. Aby uzyskać więcej informacji i przykładów, zobacz Temat Wzbogacanie referencyjne w zestawie umiejętności usługi Azure AI Search.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.
{ "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" } ] }
Przypisz wszystkie funkcje mapowania potrzebne do przekształcenia zawartości pola przed zapisaniem go w indeksie. W przypadku węzłów wzbogacania kodowanie i dekodowanie to najczęściej używane funkcje.
Mapowanie pól wyjściowych "jeden do wielu"
Mapowanie pól wyjściowych umożliwia kierowanie pojedynczego pola źródłowego do wielu pól w indeksie wyszukiwania. Można to zrobić na potrzeby testowania porównawczego lub jeśli chcesz, aby pola z różnymi atrybutami.
Przyjmij zestaw umiejętności, który generuje osadzanie dla pola wektorowego, oraz indeks zawierający wiele pól wektorów, które różnią się w zależności od ustawień algorytmu i kompresji. W indeksatorze zamapuj dane wyjściowe umiejętności osadzania na każde z wielu pól wektorów w indeksie wyszukiwania.
"outputFieldMappings": [
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_hnsw" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_eknn" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_narrow" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_no_stored" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_scalar" }
]
Ścieżka pola źródłowego to dane wyjściowe umiejętności. W tym przykładzie dane wyjściowe są text_vector. Nazwa docelowa jest opcjonalną właściwością. Jeśli nie nadasz mapowaniu danych wyjściowych nazwę docelową, ścieżka zostanie osadzona lub dokładniej : /document/content/embedding.
{
"name": "test-vector-size-ss",
"description": "Generate embeddings using AOAI",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "#1",
"description": null,
"context": "/document/content",
"resourceUri": "https://my-demo-eastus.openai.azure.com",
"apiKey": null,
"deploymentId": "text-embedding-ada-002",
"dimensions": 1536,
"modelName": "text-embedding-ada-002",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"authIdentity": null
}
]
}
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 indeksować ten 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 importowanie. 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": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"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, w którym indeksator otwiera dokument źródłowy i odczytuje go do pamięci.
Następująca przykładowa definicja indeksu używa kolekcji ciągów do odbierania spłaszanych 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 z 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 poniższego przykładu może być dokładnie tym, czego potrzebujesz.
{
"value": [
{
"@search.score": 1,
"id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"palette": "primary colors",
"color_names": [
"blue",
"red",
"yellow"
],
"color_mediums": [
"[\"acrylic\",\"oil\",\"pastel\"]",
"[\"acrylic\",\"pastel\",\"watercolor\"]",
"[\"acrylic\",\"watercolor\"]"
]
}
]
}