Индексирование БОЛЬШИХ двоичных объектов и файлов JSON в поиске ИИ Azure

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

Для индексирования БОЛЬШИХ двоичных объектов в службе "Поиск ИИ Azure" в этой статье показано, как задать свойства больших двоичных объектов или файлов, состоящих из документов JSON. JSON-файлы в Хранилище BLOB-объектов Azure или Файлы Azure обычно предполагают любую из следующих форм:

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

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

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

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

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

Примечание.

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

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

Индексация отдельных документов JSON (по одному на большой двоичный объект)

По умолчанию индексаторы 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=2020-06-30
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-объектов в службе Когнитивного поиска.

Пример 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=2020-06-30
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, чтобы указать, что они содержат многоуровневую структуру. Например, если большой двоичный объект выглядит следующим образом:

{
    "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, разделенных символами новой строки

Если большой двоичный объект содержит несколько сущностей 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=2020-06-30
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 и их извлечения в поля верхнего уровня в документе поиска.

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

{
    "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, имеющих другую схему (что является распространенным вариантом использования). Так как проверка не выполняется, внимательно проверяйте сопоставления на наличие опечаток, чтобы не терять документы без причины.

Следующие шаги