Индексирование BLOB-объектов и JSON-файлов в поиске Azure AI

Замечание

Поиск с использованием ИИ Azure доступна через портал Azure, REST API и Azure SDKs. Он также лежит в основе Foundry IQ — управляемого слоя знаний, который преобразует корпоративный контент в многократно используемые базы знаний с учетом разрешений доступа для агентов на портале Microsoft Foundry.

Область применения: индексаторы BLOB-объектов, индексаторы файлов

Для индексирования объектов BLOB в Azure Cognitive Search в этой статье показано, как задать свойства для объектов BLOB или файлов, состоящих из документов JSON. JSON-файлы в Хранилище BLOB-объектов Azure или Файлы Azure обычно предполагают любую из следующих форм:

  • отдельный документ JSON;
  • документ JSON, содержащий массив корректно сформированных JSON-элементов.
  • JSON-документ, содержащий несколько сущностей, разделенных символом новой строки.

Индексатор BLOB предоставляет parsingMode параметр для оптимизации выходных данных поискового документа на основе структуры JSON. Режимы синтаксического анализа состоят из следующих параметров:

режим парсинга Документ JSON Description
json Один на один блоб Анализирует большие двоичные объекты JSON как отдельный блок текста (по умолчанию). Каждый блок JSON становится отдельным документом поиска.
jsonArray Несколько на блок данных Анализирует JSON массив в блобе, где каждый элемент массива становится отдельным документом поиска.
jsonLines Несколько на блок данных Анализирует большой двоичный объект, содержащий несколько сущностей JSON (также массив) с отдельными элементами, разделенными символом новой строки. После каждой новой строки индексатор начинает новый документ поиска.

Для настройки jsonArray и jsonLines следует ознакомиться с разделом Индексирование больших двоичных объектов для получения нескольких поисковых документов, чтобы понять, как индексатор BLOB-объектов обрабатывает неоднозначность ключа документа для нескольких документов поиска, полученных из одного большого двоичного объекта.

В определении индексатора можно использовать сопоставление полей для выбора свойств исходного документа JSON, применяемых для заполнения целевого индекса поиска. Например, при использовании режима синтаксического анализа jsonArray, если массив существует как свойство нижнего уровня, можно задать свойство "documentRoot", указывающее, где массив помещается в двоичный большой объект.

Замечание

При использовании режима синтаксического анализа JSON Поиск с использованием ИИ Azure предполагает, что все блобы используют один и тот же синтаксический анализатор (либо для json, jsonArray или jsonLines). Если у вас есть сочетание различных типов файлов в одном источнике данных, рекомендуется использовать фильтры расширений файлов для управления импортируемыми файлами.

В следующих разделах каждый из этих режимов описан подробнее. Если вы не знакомы с клиентами и понятиями индексатора, см. статью "Создание индексатора поиска". Кроме того, следует ознакомиться с подробными сведениями о базовой конфигурации индексатора BLOB-объектов, которая здесь не приводится.

Индексация отдельных JSON-документов (по одному на каждый Blob)

По умолчанию индексаторы BLOB-объектов анализируют большие двоичные объекты JSON как один блок текста, то есть один документ поиска создается для каждого большого двоичного объекта в контейнере. Если документ JSON структурирован, то документ поиска может отражать эту структуру, а его отдельные элементы могут быть представлены в виде отдельных полей. Например, предположим, что в Хранилище BLOB-объектов Azure имеется следующий документ JSON:

{
    "article" : {
        "text" : "A hopefully useful article explaining how to parse JSON blobs",
        "datePublished" : "2020-04-13",
        "tags" : [ "search", "storage", "howto" ]    
    }
}

Индексатор BLOB-объектов анализирует документ JSON и выдает один поисковый документ, загружая индекс и сопоставляя "text", "datePublished" и "Tags" из источника с полями целевого индекса, имена и тип которых совпадают. Если имеется индекс с полями "text", "datePublished и "tags", индексатор больших двоичных объектов может определить правильное сопоставление без наличия сопоставления полей в запросе.

Хотя поведение по умолчанию предусматривает один поисковый документ на каждый JSON-объект, установка режима синтаксического анализа json изменяет внутренние сопоставления полей для содержимого, продвигая поля внутри content в фактические поля в индексе поиска. Пример определения индексатора для режима анализа json может выглядеть следующим образом:

POST https://[service name].search.windows.net/indexers?api-version=2026-04-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "json" } }
}

Замечание

Как и в случае с любыми индексаторами, если поля не соответствуют, следует явно указывать отдельные сопоставления полей, если вы не используете неявные сопоставления полей, доступные для содержимого и метаданных BLOB-объектов, как описано в базовой конфигурации BLOB-индексатора. Чтобы переопределить существующее значение индекса, исходный JSON должен предоставить ненулевое значение. Если поле в исходном документе равно NULL, индексатор сохранит существующее значение. Чтобы явно очистить поле, передайте пустую строку ("") вместо этого. Это предотвращает непреднамеренные удаления из индекса.

Пример JSON (JSON-файлы с данными для одного отеля)

Набор данных документов JSON для отеля в GitHub удобен для тестирования анализа JSON, когда каждый большой двоичный объект представляет структурированный JSON-файл. Файлы данных можно загрузить в Blob-хранилище и использовать мастер импорта, чтобы быстро оценить, как это содержимое преобразуется в отдельные документы поиска.

Набор данных состоит из пяти блоков данных, каждый из которых содержит документ для отеля с коллекцией адресов и коллекцией комнат. Индексатор BLOB выявляет обе коллекции и отображает структуру входных данных в схеме индекса.

Анализ массивов JSON

В качестве альтернативы можно использовать функцию массивов JSON. Эту функцию удобно использовать, если большие двоичные объекты содержат объекты JSON с правильным форматом и вы хотите представить каждый элемент в виде отдельного документа поиска. При использовании jsonArrays приведенный ниже большой двоичный объект JSON порождает три отдельных документа, каждый из которых содержит поля "id" и "text".

[
    { "id" : "1", "text" : "example 1" },
    { "id" : "2", "text" : "example 2" },
    { "id" : "3", "text" : "example 3" }
]

Свойство parameters в индексаторе содержит значения режима анализа. Для массива JSON определение индексатора должно выглядеть, как в следующем примере.

POST https://[service name].search.windows.net/indexers?api-version=2026-04-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "jsonArray" } }
}

Пример jsonArrays

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

Набор данных состоит из восьми блобов, каждый из которых содержит массив сущностей JSON, всего 100 сущностей. Сущности различаются тем, какие поля заполнены, но конечный результат — это один документ поиска для каждой сущности из всех массивов и всех блобов.

Анализ вложенных массивов JSON

Для массивов JSON, имеющих вложенные элементы, можно задать documentRoot, чтобы указать, что они содержат многоуровневую структуру. Например, если ваши объекты типа BLOB выглядят следующим образом:

{
    "level1" : {
        "level2" : [
            { "id" : "1", "text" : "Use the documentRoot property" },
            { "id" : "2", "text" : "to pluck the array you want to index" },
            { "id" : "3", "text" : "even if it's nested inside the document" }  
        ]
    }
}

Используйте эту конфигурацию для индексации массива, содержащегося в свойстве level2:

{
    "name" : "my-json-array-indexer",
    ... other indexer properties
    "parameters" : { "configuration" : { "parsingMode" : "jsonArray", "documentRoot" : "/level1/level2" } }
}

Анализ сущностей JSON, разделенных символами новой строки

Если ваш объект Blob содержит несколько сущностей JSON, разделенных символом новой строки и требуется, чтобы каждый элемент становился отдельным документом для поиска, используйте jsonLines.

{ "id" : "1", "text" : "example 1" }
{ "id" : "2", "text" : "example 2" }
{ "id" : "3", "text" : "example 3" }

Для строчного документа JSON определение индексатора должно выглядеть, как в примере ниже.

POST https://[service name].search.windows.net/indexers?api-version=2026-04-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "jsonLines" } }
}

Сопоставление полей JSON с полями поиска

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

Следующий пример иллюстрирует этот сценарий. Дополнительные сведения о сопоставлениях полей см. в разделе сопоставления полей.

{
    "article" : {
        "text" : "A hopefully useful article explaining how to parse JSON blobs",
        "datePublished" : "2016-04-13"
        "tags" : [ "search", "storage", "howto" ]    
    }
}

Допустим, что у вас есть индекс поиска со следующими полями: text типа Edm.String, date типа Edm.DateTimeOffset и tags типа Collection(Edm.String). Обратите внимание на несоответствие между полем "datePublished" в источнике и полем date в индексе. Чтобы сопоставить JSON с необходимой формой, используйте следующие сопоставления полей:

"fieldMappings" : [
    { "sourceFieldName" : "/article/text", "targetFieldName" : "text" },
    { "sourceFieldName" : "/article/datePublished", "targetFieldName" : "date" },
    { "sourceFieldName" : "/article/tags", "targetFieldName" : "tags" }
    ]

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

Также можно ссылаться на отдельные элементы массива, используя отсчитываемый от нуля индекс. Например, чтобы выбрать первый элемент массива "tags" из приведенного выше примера, используйте следующее сопоставление полей:

{ "sourceFieldName" : "/article/tags/0", "targetFieldName" : "firstTag" }

Замечание

Если "sourceFieldName" ссылается на свойство, которое не существует в объекте JSON, это сопоставление пропускается без возникновения ошибки. Такое поведение позволяет продолжить индексирование больших двоичных объектов JSON, имеющих другую схему (что является распространенным вариантом использования). Поскольку отсутствует проверка, тщательно проверяйте сопоставления на наличие опечаток, чтобы избежать потери документов из-за ошибок.

Дальнейшие шаги