Поделиться через


Сопоставления полей и преобразования с помощью индексаторов поиска ИИ Azure

Этапы индексатора

В этой статье объясняется, как задать явные сопоставления полей, которые устанавливают путь к данным между исходными полями в поддерживаемом источнике данных и целевых полях в индексе поиска.

Когда необходимо установить сопоставление полей

Когда индексатор поиска Azure AI загружает индекс поиска, он определяет путь к данным с помощью сопоставлений полей источника и назначения. Неявные сопоставления полей являются внутренними и происходят, когда имена полей и типы данных совместимы между источником и назначением. Если входные и выходные данные не совпадают, можно определить явные сопоставления полей для настройки пути к данным, как описано в этой статье.

Сопоставления полей также можно использовать для упрощённого преобразования данных, таких как кодирование или декодирование, с помощью функций отображения. Если требуется больше обработки, рассмотрите Azure Data Factory для преодоления разрыва.

Применяются следующие сопоставления полей:

  • Физические структуры данных на обеих сторонах пути к данным. Логические структуры данных, созданные навыками, находятся только в памяти. Используйте outputFieldMappings для сопоставления узлов в памяти с полями вывода в индексе поиска.

  • Только индексы родительского поиска с ИИ. Для вспомогательных индексов с дочерними документами или блоками обратитесь к сценариям расширенного сопоставления полей.

  • Только поля поиска верхнего уровня, где targetFieldName это простое поле или коллекция. Целевое поле не может быть сложным типом.

Поддерживаемые сценарии

Убедитесь, что используете поддерживаемый источник данных для индексирования, управляемого индексатором.

Вариант использования Описание
Несоответствие имен Предположим, что источник данных имеет поле с именем _city. Учитывая, что Azure AI Search не разрешает использовать в именах полей начальный символ подчеркивания, сопоставление полей позволяет эффективно преобразовать "_city" в "city".

Если требования к индексированию включают получение содержимого из нескольких источников данных, где имена полей зависят от источников, можно использовать сопоставление полей для уточнения пути.
Несоответствие типов Предположим, что нужно, чтобы исходное целочисленное поле было типом Edm.String , чтобы он был доступен для поиска в индексе поиска. Так как типы отличаются, необходимо определить сопоставление полей, чтобы путь к данным удалось успешно завершить. Обратите внимание, что поиск по искусственному интеллекту Azure имеет меньший набор поддерживаемых типов данных, чем многие источники данных. При импорте данных SQL сопоставление полей позволяет сопоставить нужный тип данных SQL в индексе поиска.
Пути передачи данных "один ко многим" Вы можете заполнить несколько полей в индексе содержимым из одного исходного поля. Например, может потребоваться применить различные анализаторы к каждому полю для поддержки различных вариантов использования в клиентском приложении.
Кодировка и декодирование Функции сопоставления можно применить для поддержки кодировки Base64 или декодирования данных во время индексирования.
Разделение строк или переадресовка массивов в коллекции Можно применить функции сопоставления для разделения строки, включающей разделитель, или отправить массив JSON в поле поиска типа Collection(Edm.String).

Примечание.

Если сопоставления полей отсутствуют, индексаторы предполагают, что поля источника данных должны быть сопоставлены с полями индекса с тем же именем. Добавление сопоставления полей переопределяет сопоставления полей по умолчанию для исходных и целевых полей. Некоторые индексаторы, такие как индексатор BLOB-хранилища, автоматически добавляют маппинг полей по умолчанию для поля ключа индекса.

Сложные поля не поддерживаются в процессе сопоставления полей. Исходная структура (вложенные или иерархические структуры) должна точно соответствовать сложному типу в индексе, чтобы сопоставления по умолчанию работали. Для получения дополнительной информации см. руководство «Индексирование вложенных JSON BLOB-объектов». Если вы получите ошибку, аналогичную "Field mapping specifies target field 'Address/city' that doesn't exist in the index", это происходит из-за невозможности использования сложного типа в сопоставлениях целевых полей.

При необходимости может потребоваться всего несколько узлов в сложной структуре. Чтобы получить отдельные узлы, можно преобразовать входящие данные в коллекцию строк (см. OutputFieldMappings для этого обходного решения).

Определите сопоставление полей

В этом разделе описаны действия по настройке сопоставлений полей.

  1. Используйте Create Indexer или Create or Update Indexer или эквивалентный метод в SDK Azure. Ниже приведен пример определения индексатора.

    {
       "name": "myindexer",
       "description": null,
       "dataSourceName": "mydatasource",
       "targetIndexName": "myindex",
       "schedule": { },
       "parameters": { },
       "fieldMappings": [],
       "disabled": false,
       "encryptionKey": { }
     }
    
  2. Заполните этот массив fieldMappings, чтобы указать сопоставления. Сопоставление полей состоит из трех частей.

    "fieldMappings": [
      {
        "sourceFieldName": "_city",
        "targetFieldName": "city",
        "mappingFunction": null
      }
    ]
    
    Свойство Описание
    Имя исходного поля Обязательный. Представляет поле в источнике данных.
    ИмяЦелевогоПоля Необязательно. Представляет поле в индексе поиска. Если значение пропущено, для целевого объекта предполагается значение sourceFieldName. Целевые поля должны быть простыми полями верхнего уровня или коллекциями. Это не может быть сложный тип или коллекция. При обработке проблемы с типом данных в определении индекса указывается тип данных поля. Для сопоставления полей достаточно указать имя поля.
    сопоставлениеФункция Необязательно. Состоит из предопределенных функций , которые преобразуют данные.

Пример: несоответствие имен или типов

Явное сопоставление полей устанавливает путь к данным для случаев, когда имя и тип не совпадают.

Поиск ИИ Azure использует сравнение без учета регистра для интерпретации имен полей и функций в сопоставлениях полей. Это удобно (вам не нужно точно соблюдать регистр), но это означает, что источник данных или индекс не может иметь поля, которые различаются только регистром.

PUT https://[service name].search.windows.net/indexers/myindexer?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
    "dataSourceName" : "mydatasource",
    "targetIndexName" : "myindex",
    "fieldMappings" : [ { "sourceFieldName" : "_city", "targetFieldName" : "city" } ]
}

Пример: один ко многим или разветвленные пути данных

В этом примере сопоставляется одно исходное поле с несколькими целевыми полями (сопоставления "один ко многим"). Поле можно "разветвить", копируя одно и то же содержимое исходного поля в два различных индексных поля, которые будут анализироваться или атрибутироваться по-разному в индексе.


"fieldMappings" : [
    { "sourceFieldName" : "text", "targetFieldName" : "textStandardEnglishAnalyzer" },
    { "sourceFieldName" : "text", "targetFieldName" : "textSoundexAnalyzer" }
]

Вы можете использовать аналогичный подход для контента, сгенерированного с помощью навыков.

Сопоставление функций и примеров

Функция сопоставления полей преобразует содержимое поля до его сохранения в индексе. В настоящее время поддерживаются следующие функции сопоставления:

Обратите внимание, что эти функции поддерживаются исключительно для родительских индексов в настоящее время. Они несовместимы с сопоставлением фрагментированных индексов, поэтому эти функции нельзя использовать для проекций индексов.

Функция base64Encode

Выполняет безопасное для URL Base64-кодирование входной строки. Входные данные должны быть в кодировке UTF-8.

Пример: базовая кодировка ключа документа

Только символы, безопасные для URL, могут появляться в ключе документа Azure AI Search, чтобы вы могли обратиться к документу с помощью API Lookup. Если исходное поле для ключа содержит небезопасные символы URL-адреса, например - и \используйте base64Encode функцию для преобразования его во время индексирования.

В следующем примере указывается функция base64Encode для metadata_storage_name обработки неподдерживаемых символов.

PUT /indexers?api-version=2025-09-01
{
  "dataSourceName" : "my-blob-datasource ",
  "targetIndexName" : "my-search-index",
  "fieldMappings" : [
    { 
        "sourceFieldName" : "metadata_storage_name", 
        "targetFieldName" : "key", 
        "mappingFunction" : { 
            "name" : "base64Encode",
            "parameters" : { "useHttpServerUtilityUrlTokenEncode" : false }
        } 
    }
  ]
}

Ключ документа (как до, так и после преобразования) не может превышать 1024 символов. При получении закодированного ключа во время поиска используйте base64Decode функцию, чтобы получить исходное значение ключа и использовать ее для извлечения исходного документа.

Пример: Сделать поле с кодировкой по основанию "поисковым"

Иногда требуется использовать закодированную версию поля, например metadata_storage_path ключа, но также требуется незакодированная версия для полнотекстового поиска. Для поддержки обоих сценариев можно сопоставить metadata_storage_path с двумя полями: одно для ключа (закодированного), а второе для поля пути, которое можно предположить, является атрибутом searchable в схеме индекса.

PUT /indexers/blob-indexer?api-version=2025-09-01
{
    "dataSourceName" : " blob-datasource ",
    "targetIndexName" : "my-target-index",
    "schedule" : { "interval" : "PT2H" },
    "fieldMappings" : [
        { "sourceFieldName" : "metadata_storage_path", "targetFieldName" : "key", "mappingFunction" : { "name" : "base64Encode" } },
        { "sourceFieldName" : "metadata_storage_path", "targetFieldName" : "path" }
      ]
}

Пример: сохранение исходных значений

Индексатор хранилища blob автоматически добавляет сопоставление полей из metadata_storage_path, URI blob, в поле ключа индекса, если сопоставление полей не указано. Это значение закодировано в кодировке Base64, поэтому оно безопасно использовать в качестве ключа документа поиска ИИ Azure. В следующем примере показано, как одновременно сопоставлять безопасную для URL-адреса версию metadata_storage_path, закодированную с помощью Base64, с полем index_key и сохранить исходное значение в поле metadata_storage_path.

"fieldMappings": [
  {
    "sourceFieldName": "metadata_storage_path",
    "targetFieldName": "metadata_storage_path"
  },
  {
    "sourceFieldName": "metadata_storage_path",
    "targetFieldName": "index_key",
    "mappingFunction": {
       "name": "base64Encode"
    }
  }
]

Если свойство parameters для функции сопоставления не указано, по умолчанию используется значение {"useHttpServerUtilityUrlTokenEncode" : true}.

Служба "Поиск ИИ Azure" поддерживает два разных кодировки Base64. При кодировании и декодировании одного и того же поля следует использовать одни и те же параметры. Чтобы решить, какие параметры использовать, см. дополнительные сведения в разделе о вариантах кодировки Base64.

Функция base64Decode

Выполняет декодирование входной строки в Base64. Предполагается, что входные данные представляют собой безопасную для URL-адреса строку в кодировке Base64.

Пример. декодирование метаданных BLOB-объектов или URL-адресов

Исходные данные могут содержать строки в кодировке Base64, например строки метаданных BLOB-объектов или URL-адреса веб-узлов, которые требуется включить в поиск в виде обычного текста. Можно использовать функцию base64Decode, чтобы при заполнении индекса поиска снова превратить закодированные данные в обычные строки.

"fieldMappings" : [
  {
    "sourceFieldName" : "Base64EncodedMetadata",
    "targetFieldName" : "SearchableMetadata",
    "mappingFunction" : { 
      "name" : "base64Decode", 
      "parameters" : { "useHttpServerUtilityUrlTokenDecode" : false }
    }
  }
]

Если свойство parameters не указано, по умолчанию используется значение {"useHttpServerUtilityUrlTokenEncode" : true}.

Служба "Поиск ИИ Azure" поддерживает два разных кодировки Base64. При кодировании и декодировании одного и того же поля следует использовать одни и те же параметры. Чтобы решить, какие параметры использовать, см. дополнительные сведения в разделе о вариантах кодировки Base64.

Варианты кодировки Base64

Поиск ИИ Azure поддерживает URL-безопасную и обычную кодировку base64. Строку, кодируемую с помощью Base64 во время индексирования, позже нужно декодировать, используя те же параметры кодировки, иначе результат не будет совпадать с оригиналом.

Если параметрам useHttpServerUtilityUrlTokenEncode или useHttpServerUtilityUrlTokenDecode для кодирования и декодирования соответственно присвоено значение true, то base64Encode ведет себя как HttpServerUtility.UrlTokenEncode, а base64Decode — как HttpServerUtility.UrlTokenDecode.

Предупреждение

Если для получения значений ключей используется base64Encode, для параметра useHttpServerUtilityUrlTokenEncode необходимо установить значение true. Для значений ключа можно использовать только безопасную для URL-адреса кодировку Base64. Смотрите правила именования для полного набора ограничений на символы в значениях ключей.

Предполагается, что библиотеки .NET в Azure AI Search используют полную версию .NET Framework, которая обеспечивает встроенную кодировку. useHttpServerUtilityUrlTokenEncode и useHttpServerUtilityUrlTokenDecode параметры применяют эту встроенную функцию. Если вы используете .NET Core или другую платформу, рекомендуется задать эти параметры на false и напрямую вызывать функции кодирования и декодирования вашего фреймворка.

В следующей таблице сравниваются различные кодировки Base64 строки 00>00?00. Чтобы определить необходимую обработку (если есть) для функций base64, примените функцию кодирования библиотеки к строке 00>00?00 и сравните выходные данные с ожидаемыми выходными данными MDA-MDA_MDA.

Кодировка Результат кодирования в Base64 Дополнительная обработка после кодирования библиотеки Дополнительная обработка перед декодированием библиотеки
Base64 с заполнением MDA+MDA/MDA= Использовать безопасные знаки URL-адреса и удалить заполнение Использовать стандартные символы кодировки Base64 и добавить заполнение
Base64 без заполнения MDA+MDA/MDA Использовать безопасные символы URL-адреса Использовать стандартные знаки Base64
Безопасное для URL кодирование в Base64 с дополнительными символами MDA-MDA_MDA= Удалить заполнение Добавьте заполнение
Безопасное кодирование строки вводных данных в Base64 без заполнения MDA-MDA_MDA нет нет

Функция extractTokenAtPosition

Разбивает поле строки, используя заданный разделитель, и выбирает маркер из указанной позиции в результате разбиения.

Эта функция использует следующие параметры:

  • delimiter: строка, которая используемая как разделитель при разбиении входной строки.
  • position: целочисленная нулевая позиция токена, которую нужно выбрать после разбиения входной строки.

Например, если при входных данных Jane Doe параметр delimiter имеет значение " " (пробел), а параметр position — значение 0, то результатом будет Jane; если параметр position имеет значение 1, то результатом будет Doe. Если позиция ссылается на несуществующий токен, выдается ошибка.

Пример: извлечение имени

Источник данных содержит поле PersonName, и вам нужно индексировать его как два отдельных поля — FirstName и LastName. Эта функция позволяет разбить входные данные, используя пробел как разделитель.

"fieldMappings" : [
  {
    "sourceFieldName" : "PersonName",
    "targetFieldName" : "FirstName",
    "mappingFunction" : { "name" : "extractTokenAtPosition", "parameters" : { "delimiter" : " ", "position" : 0 } }
  },
  {
    "sourceFieldName" : "PersonName",
    "targetFieldName" : "LastName",
    "mappingFunction" : { "name" : "extractTokenAtPosition", "parameters" : { "delimiter" : " ", "position" : 1 } }
  }]

Функция jsonArrayToStringCollection

Преобразует строку, отформатированную как массив строк JSON, в массив строк, который можно использовать для заполнения поля Collection(Edm.String) в индексе.

Например, если исходной строкой является ["red", "white", "blue"], то целевое поле типа Collection(Edm.String) будет заполнено следующими тремя значениями: red, white и blue. Для входных значений, которые не могут быть проанализированы как массивы строк JSON, возвращается ошибка.

Пример: заполнение коллекции реляционными данными

База данных SQL Azure не имеет встроенный тип данных, который естественно сопоставляется с полями Collection(Edm.String) в поиске ИИ Azure. Чтобы заполнить поля сбора строк, можно предварительно обработать исходные данные в виде массива строк JSON, а затем использовать функцию jsonArrayToStringCollection сопоставления.

"fieldMappings" : [
  {
    "sourceFieldName" : "tags", 
    "mappingFunction" : { "name" : "jsonArrayToStringCollection" }
  }]

Функция urlEncode

Эту функцию можно использовать для кодирования строки, чтобы она была безопасной для URL-адреса. При использовании со строкой, содержащей символы, которые не разрешены в URL-адресе, эта функция преобразует эти "неразрешённые" символы в эквиваленты сущностей символов. Эта функция использует формат кодировки UTF-8.

Пример: поиск ключа документа

Функцию urlEncode можно использовать в качестве альтернативы функции base64Encode, если требуется преобразовать только небезопасные символы URL-адреса и оставить другие символы как есть.

Например, если исходной строкой является <hello>, то в целевое поле типа (Edm.String) будет внесено значение %3chello%3e

При извлечении закодированного ключа во время поиска можно использовать функцию urlDecode, чтобы получить исходное значение ключа и с его помощью извлечь исходный документ.

"fieldMappings" : [
  {
    "sourceFieldName" : "SourceKey",
    "targetFieldName" : "IndexKey",
    "mappingFunction" : {
      "name" : "urlEncode"
    }
  }
]

Функция urlDecode

Эта функция преобразует строку в кодировке URL в декодированную строку, используя формат кодирования UTF-8.

Пример. декодирование метаданных BLOB-объекта

Некоторые клиенты хранилищ Azure автоматически кодируют метаданные BLOB-объектов в формате URL, если они содержат символы, не являющиеся частью набора ASCII. Однако если вы хотите сделать такие метаданные доступными для поиска (в виде обычного текста), можно использовать функцию urlDecode, чтобы снова преобразовать закодированные данные в обычные строки при заполнении индекса поиска.

"fieldMappings" : [
  {
    "sourceFieldName" : "UrlEncodedMetadata",
    "targetFieldName" : "SearchableMetadata",
    "mappingFunction" : {
      "name" : "urlDecode"
    }
  }
]

Функция fixedLengthEncode

Эта функция преобразует строку любой длины в строку фиксированной длины.

Пример: сопоставление слишком длинных ключей документов

При возникновении ошибок, связанных с длиной ключа документа, превышающей 1024 символов, эта функция может применяться для уменьшения длины ключа документа.


"fieldMappings" : [
 {
   "sourceFieldName" : "metadata_storage_path",
   "targetFieldName" : "your key field",
   "mappingFunction" : {
     "name" : "fixedLengthEncode"
   }
 }
]

Функция toJson

Эта функция преобразует строку в форматированный объект JSON. Это можно использовать для сценариев, когда источник данных, например SQL Azure, не поддерживает составные или иерархические типы данных, а затем сопоставляет его со сложными полями.

Пример. Сопоставление текстового содержимого со сложным полем

Предположим, что в индексе есть строка SQL со строкой JSON, которую необходимо сопоставить со сложным полем (соответствующим образом определенным) в индексе, toJson эту функцию можно использовать для этого. Например, если сложное поле в индексе должно быть заполнено следующими данными:

{
    "id": "5",
    "info": {
        "name": "Jane",
        "surname": "Smith",
        "skills": [
            "SQL",
            "C#",
            "Azure"
        ],
        "dob": "2005-11-04T12:00:00"
    }
}

Его можно достичь с помощью toJson функции сопоставления в столбце строки JSON в строке SQL, которая выглядит следующим образом: {"id": 5, "info": {"name": "Jane", "surname": "Smith", "skills": ["SQL", "C#", "Azure"]}, "dob": "2005-11-04T12:00:00"}

Сопоставление полей должно быть указано следующим образом.


"fieldMappings" : [
  {
    "sourceFieldName" : "content",
    "targetFieldName" : "complexField",
    "mappingFunction" : {
      "name" : "toJson"
    }
  }
]

Сценарии расширенного сопоставления полей

В сценариях, когда у вас есть связи "один ко многим", такие как фрагментирование или разделение данных, следуйте данным рекомендациям для сопоставления полей из родительских документов к дочерним документам (фрагменты):

1. Пропуск индексирования родительского документа

Если вы пропускаете индексирование родительских документов (установив projectionMode в skipIndexingParentDocuments в наборе параметров indexProjections), используйте проекции индекса для сопоставления полей из родительских документов с дочерними документами.

2. Индексирование родительских и дочерних документов

Если вы индексируете родительские и дочерние документы:

  • Используйте сопоставления полей для сопоставления полей с родительскими документами.
  • Используйте проекции индекса для сопоставления полей с дочерними документами.

3. Сопоставление значений, преобразованных функцией, с родительскими и/или дочерними документами

Если поле в родительском документе требует преобразования (с помощью функций сопоставления, таких как кодировка) и должно быть сопоставлено с родительскими и/или дочерними документами:

  • Примените преобразование с помощью функций сопоставления полей в индексаторе.
  • Используйте проекции индексов в наборе навыков, чтобы сопоставить преобразованное поле с дочерними документами.

См. также