Проекции индексов в поиске ИИ Azure

Важно!

Проекции индекса находятся в общедоступной предварительной версии в рамках дополнительных условий использования. Она доступна через интерфейсы REST API портал Azure, 2023-10-01-Preview REST API, портал Azure и бета-версии клиентских библиотек, которые были обновлены, чтобы включить эту функцию.

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

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

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

Определение проекций индекса

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

  • targetIndexName: имя индекса в службе поиска, в которую входит индекс данных проекции индекса.
  • parentKeyFieldName: имя поля в целевом индексе, содержащее значение ключа родительского документа.
  • sourceContext: заметка обогащения, определяющая степень детализации, при которой данные сопоставляться с отдельными документами поиска. Дополнительные сведения см. в разделе Контекст навыка и язык заметок ввода.
  • mappings: массив сопоставлений обогащенных данных с полями в индексе поиска. Каждое сопоставление состоит из следующих элементов:
    • name: имя поля в индексе поиска, в который должны индексироваться данные,
    • source: Путь заметки обогащения, из который должны быть извлечены данные.

Каждый из них mapping также может рекурсивно определять данные с необязательным sourceContext и inputs полем, аналогичным хранилищу знаний или навыку фигуры. Эти параметры позволяют индексировать данные в поля типа Edm.ComplexType в индексе поиска.

Индекс, определенный в параметре targetIndexName , имеет следующие требования:

  • Необходимо уже создать в службе поиска перед созданием набора навыков, содержащего определение проекций индекса.
  • Должен содержать поле с именем, определенным в параметре parentKeyFieldName . Это поле должно быть типом Edm.String, не может быть ключевым полем и должно иметь значение true для фильтра.
  • Поле ключа должно иметь значение true для поиска и определяться с помощью анализатора keyword .
  • Должны иметь поля, определенные для каждого из nameуказанных в mappings, ни один из которых не может быть ключевым полем.

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

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "myTargetIndex",
            "parentKeyFieldName": "ParentKey",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*"
                }
            ]
        }
    ]
}

Обработка родительских документов

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

  • Чтобы сохранить родительские и дочерние документы в отдельных индексах, необходимо просто убедиться, что targetIndexName определение индексатора отличается от определенного targetIndexName в селекторе проекции индекса.

  • Чтобы индексировать родительские и дочерние документы в один и тот же индекс, необходимо убедиться, что схема целевого индекса работает как с определенным fieldMappings , так и outputFieldMappings в определении индексатора и mappings в селекторе проекции индекса. Затем вы просто укажите то же targetIndexName самое для определения индексатора и селектора проекции индекса.

  • Чтобы игнорировать родительские документы и только индексировать дочерние документы, вам по-прежнему необходимо указать targetIndexName определение индексатора (вы можете просто указать тот же, что и для селектора проекции индекса). Затем определите отдельный parameters объект рядом с selectors определением с набором skipIndexingParentDocumentsключейprojectionMode, как показано ниже:

    "indexProjections": {
        "selectors": [
            ...
        ],
        "parameters": {
            "projectionMode": "skipIndexingParentDocuments"
        }
    }
    

Версию 2023-10-01-Preview REST API можно использовать для создания проекций индекса с помощью добавления набора навыков.

Жизненный цикл содержимого

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

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

Примечание.

Хотя можно вручную изменить данные в проецируемых документах с помощью API push-отправки индекса, все изменения будут перезаписаны при следующем вызове конвейера, при условии, что документ в исходных данных обновляется.

Значение проецируемого ключа

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

  • Случайный хэш для обеспечения уникальности. Этот хэш изменяется, если родительский документ обновляется во время выполнения индексатора.
  • Ключ родительского документа.
  • Путь заметки обогащения, определяющий контекст, из который был создан документ.

Например, если разделить родительский документ с ключевым значением "123" на четыре страницы, а затем каждая из этих страниц проецируется как собственный документ через проекции индекса, ключ для третьей страницы текста будет выглядеть примерно так, как "01f07abfe7ed_123_pages_2". Если родительский документ будет обновлен, чтобы добавить пятую страницу, новый ключ для третьей страницы может быть "9d800bdacc0e_123_pages_2", так как случайные хэш-значения изменяются между индексатором, даже если остальные данные проекции не изменились.

Изменения или дополнения

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

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

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

удаления

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

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