Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье объясняется, как настроить сопоставления полей вывода, определяя путь данных между данными в памяти, созданными во время обработки набора навыков, и целевыми полями в индексе поиска. Во время выполнения индексатора информация, созданная навыками, существует только в памяти. Чтобы сохранить эти сведения в индексе поиска, необходимо указать индексатору, куда отправлять данные.
Сопоставление выходных полей определяется в индексаторе и содержит следующие элементы:
"outputFieldMappings": [
{
"sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
"targetFieldName": "some-search-field-in-an-index",
"mappingFunction": null
}
],
В отличие от fieldMappings определения, которое задает соответствие между вербатимными исходными полями и полями индекса, outputFieldMappings определение связывает обогащения, хранящиеся в памяти, с полями в поисковом индексе.
Предварительные требования
Индексатор, индекс, источник данных и набор навыков.
Поля индекса должны быть простыми или полями верхнего уровня. Вы не можете выводить сложный тип. Однако если у вас есть сложный тип, можно использовать определение поля вывода для выравнивания частей сложного типа и отправки их в коллекцию в индексе поиска.
Когда следует использовать сопоставление выходных полей
Сопоставления выходных полей требуются, если индексатор имеет подключенный набор навыков, который создает новые сведения, которые вы хотите видеть в вашем индексе. Вот некоторые примеры.
- Векторы из навыков внедрения
- Текст оптического распознавания символов (OCR) из изображений
- Места, организации или люди, определённые средствами распознавания сущностей.
Сопоставления полей выходных данных также можно использовать для:
Создайте несколько копий созданного содержимого (сопоставления полей вывода "один ко многим").
Преобразуйте сложный тип исходного документа в упрощённую форму. Например, предположим, что исходные документы имеют сложный тип, например многосоставной адрес, и вы хотите только город. Можно использовать сопоставление полей вывода для выравнивания вложенной структуры данных, а затем использовать сопоставление полей вывода для отправки выходных данных в коллекцию строк в индексе поиска.
Сопоставления выходных полей применяются только к поисковым индексам. Если вы заполняете хранилище знаний, используйте проекции для конфигурации путей данных.
Определение сопоставления выходных полей
Сопоставления полей выходных данных добавляются в массив outputFieldMappings в описании индексатора и обычно помещаются после массива fieldMappings. Сопоставление полей вывода состоит из трех частей.
Вы можете использовать REST API или Azure SDK для определения сопоставления выходных полей.
Совет
Индексаторы, созданные мастером импорта данных, включают сопоставления полей вывода, созданные мастером. Если вам нужны примеры, запустите мастер по вашему источнику данных, чтобы просмотреть сопоставления полей на выходе в индексаторе.
Используйте Create Indexer или Create or Update Indexer или эквивалентный метод в SDK Azure. Ниже приведен пример определения индексатора.
{ "name": "myindexer", "description": null, "dataSourceName": "mydatasource", "targetIndexName": "myindex", "schedule": { }, "parameters": { }, "fieldMappings": [], "outputFieldMappings": [], "disabled": false, "encryptionKey": { } }Заполните этот массив
outputFieldMappings, чтобы указать сопоставления. Сопоставление полей состоит из трех частей."outputFieldMappings": [ { "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document", "targetFieldName": "some-search-field-in-an-index", "mappingFunction": null } ]Свойство Описание имя исходного поля Обязательный. Указывает путь к обогащению содержимого. Примером может быть /document/content. См. раздел Справочные обогащения в наборе навыков для поиска в ИИ Azure для получения сведений о синтаксисе пути и примерах. targetFieldName Необязательно. Указывает поле поиска, которое получает обогащенное содержимое. Целевые поля должны быть простыми полями верхнего уровня или коллекциями. Это не может быть путь к подфилду в сложном типе. Если вы хотите получить определенные узлы в сложной структуре, вы можете упростить отдельные узлы в памяти, а затем отправить выходные данные в коллекцию строк в вашем индексе. сопоставлениеФункция Необязательно. Добавляет дополнительную обработку, предоставляемую функциями сопоставления, поддерживаемыми индексаторами. Для узлов обогащения кодирование и декодирование являются наиболее часто используемыми функциями. targetFieldNameвсегда является именем поля в индексе поиска.sourceFieldName— это путь к узлу в обогащенном документе. Это результат навыка. Путь всегда начинается с /document, и если индексируется из большого двоичного объекта, второй элемент пути — /content. Третий элемент — это значение, созданное навыком. Дополнительные сведения и примеры см. в статье "Обогащения ссылок" в наборе навыков для поиска Azure AI.В этом примере сущности и метки тональности, извлеченные из свойства содержимого BLOB, добавляются в поля индекса поиска.
{ "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" } ] }Назначьте любые функции сопоставления, необходимые для преобразования содержимого поля, прежде чем они будут сохранены в индексе. Для узлов обогащения кодирование и декодирование являются наиболее часто используемыми функциями.
Сопоставление полей вывода "один ко многим"
Сопоставление полей вывода можно использовать для маршрутизации одного исходного поля в несколько полей в индексе поиска. Это можно сделать для тестирования сравнения или для полей с различными атрибутами.
Предположим, что навыки, создающие встраивания для векторного поля, и индекс, содержащий несколько векторных полей в зависимости от алгоритмов и параметров сжатия. В индексаторе сопоставьте выходные данные навыка встраивания с каждым из нескольких векторных полей в индексе поиска.
"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" }
]
Путь к исходному полю — это выходные данные навыка. В этом примере выходные данные — text_vector. Имя цели является дополнительным свойством. Если вы не задаёте целевое имя сопоставления выходных данных, путь будет встроенным, а точнее, /document/content/embedding.
{
"name": "test-vector-size-ss",
"description": "Generate embeddings using Azure OpenAI in Foundry Models",
"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
}
]
}
Преобразовать сложные структуры в коллекцию строк
Если исходные данные состоят из вложенных или иерархических JSON, для настройки путей к данным нельзя использовать сопоставления полей. Вместо этого индекс поиска должен зеркально отображать структуру исходных данных для каждого уровня для полного импорта.
В этом разделе описывается процесс импорта, который создает комплексное отражение сложного документа как на исходной, так и целевой стороне. Затем он использует тот же исходный документ для иллюстрации извлечения и выравнивания отдельных узлов в коллекции строк.
Ниже приведен пример документа в Azure Cosmos DB с вложенным JSON:
{
"palette":"primary colors",
"colors":[
{
"name":"blue",
"medium":[
"acrylic",
"oil",
"pastel"
]
},
{
"name":"red",
"medium":[
"acrylic",
"pastel",
"watercolor"
]
},
{
"name":"yellow",
"medium":[
"acrylic",
"watercolor"
]
}
]
}
Если вы хотите полностью индексировать этот исходный документ, создайте определение индекса, в котором имена полей, уровни и типы отражаются как сложный тип. Так как сопоставления полей не поддерживаются для сложных типов в индексе поиска, определение индекса должно зеркально отображать исходный документ.
{
"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,
}
]
}
]
}
Ниже приведен пример определения индексатора, выполняющего импорт. Обратите внимание, что сопоставления полей отсутствуют, и набор навыков отсутствует.
{
"name": "my-test-indexer",
"dataSourceName": "my-test-ds",
"skillsetName": null,
"targetIndexName": "my-test-index",
"fieldMappings": [],
"outputFieldMappings": []
}
Результатом является следующий пример документа поиска, аналогичный исходному в 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"
]
}
]
}
]
}
Альтернативным представлением в индексе поиска является уплощение отдельных узлов вложенной структуры источника в коллекцию строк индекса поиска.
Для выполнения этой задачи потребуется outputFieldMappings , чтобы сопоставить узел в памяти со строковой коллекцией в индексе. Хотя сопоставления полей выходных данных в основном применяются к выходным данным навыка, их также можно использовать для обращения к узлам после взлома документа, где индексатор открывает исходный документ и считывает его в память.
В следующем примере определения индекса используются коллекции строк для получения неструктурированных выходных данных:
{
"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}
]
}
Вот пример определения индексатора, где используется outputFieldMappings для связывания вложенного JSON с полями коллекции строк. Обратите внимание, что исходное поле использует синтаксис пути для узлов обогащения, даже если набор навыков отсутствует. Обогащенные документы создаются в системе во время взлома документов, что означает, что вы можете получить доступ к узлам в каждом дереве документов до тех пор, пока эти узлы существуют при трещине документа.
{
"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"
}
]
}
Результаты определения приведены ниже. Упрощение структуры теряет контекст в этом случае. Связь между заданным цветом и средой, в которую она доступна, больше не существует. Однако в зависимости от вашего сценария результат, аналогичный следующему примеру, может быть именно тем, что вам нужно.
{
"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\"]"
]
}
]
}