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


Обновление или перестроение индекса в службе "Поиск ИИ Azure"

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

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

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

Обновление содержимого

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

  1. Используйте те же методы загрузки документов: Documents — Index (REST) или эквивалентный API в пакетах SDK Azure. Дополнительные сведения о методах индексирования см. в разделе "Загрузка документов".

  2. @search.action Задайте параметр, чтобы определить влияние на существующие документы:

    Действие Действие
    удалить Удаляет весь документ из индекса. Если вы хотите удалить отдельное поле, используйте слияние, задав поле под вопросом значение NULL. Удаленные документы и поля не сразу освобождают место в индексе. Каждые несколько минут фоновый процесс выполняет физическое удаление. Независимо от того, используется ли портал или API для возврата статистики индексов, вы можете ожидать небольшую задержку, прежде чем удаление будет отражено на портале и через API.
    merge Обновляет документ, который уже существует, и не удается найти документ. Слияние заменяет существующие значения. По этой причине обязательно проверьте поля коллекции, содержащие несколько значений, таких как поля типа Collection(Edm.String). Например, если tags поле начинается со значения ["budget"] и выполняется слияние с ["economy", "pool"], конечное значение tags поля равно ["economy", "pool"]. Это не будет ["budget", "economy", "pool"].
    mergeOrUpload Ведет себя как слияние, если документ существует, и отправляется, если документ является новым. Это наиболее распространенное действие для добавочных обновлений.
    отправить Аналогично "upsert", где документ вставляется, если он новый, и обновлен или заменен, если он существует. Если документ отсутствует значения, необходимые индексу, значение поля документа имеет значение NULL.
  3. Опубликуйте обновление.

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

Советы по добавочному индексации

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

  • Если вы выполняете вызовы индекса непосредственно через API push-уведомлений, используйте mergeOrUpload его в качестве действия поиска.

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

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

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

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

Ниже приведен пример REST API, демонстрирующий следующие советы:

### Get Stay-Kay City Hotel by ID
GET  {{baseUrl}}/indexes/hotels-vector-quickstart/docs('1')?api-version=2024-07-01  HTTP/1.1
    Content-Type: application/json
    api-key: {{apiKey}}

### Change the description, city, and tags for Stay-Kay City Hotel
POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search.index?api-version=2024-07-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

    {
        "value": [
            {
            "@search.action": "mergeOrUpload",
            "HotelId": "1",
            "Description": "I'm overwriting the description for Stay-Kay City Hotel.",
            "Tags": ["my old item", "my new item"],
            "Address": {
                "City": "Gotham City"
                }
            }
        ]
    }
       
### Retrieve the same document, confirm the overwrites and retention of all other values
GET  {{baseUrl}}/indexes/hotels-vector-quickstart/docs('1')?api-version=2024-07-01  HTTP/1.1
    Content-Type: application/json
    api-key: {{apiKey}}

Изменение схемы индекса

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

  • Добавление нового поля
  • Установка атрибута retrievable в существующем поле
  • Обновление searchAnalyzer поля с существующим indexAnalyzer
  • Добавьте новое определение анализатора в индекс (который можно применить к новым полям)
  • Добавление, обновление или удаление профилей повышения
  • Добавление, обновление или удаление параметров CORS
  • Добавление, обновление или удаление synonymMaps
  • Добавление, обновление или удаление семантических конфигураций

Порядок операций:

  1. Получите определение индекса.

  2. Изменение схемы с обновлениями из предыдущего списка.

  3. Обновите схему индекса в службе поиска.

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

При обновлении схемы индекса для включения нового поля существующие документы в индексе получают значение NULL для этого поля. В следующем задании индексирования значения из внешних исходных данных заменяют значения NULL, добавленные поиском ИИ Azure.

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

Удаление и перестроение индекса

Для некоторых изменений требуется удаление и перестроение индекса, заменив текущий индекс новым.

Действие Description
Удаление поля Чтобы физически удалить все следы поля, необходимо перестроить индекс. Если немедленное перестроение не является практическим, вы можете изменить код приложения для перенаправления доступа из устаревшего поля или использовать searchFields и выбрать параметры запроса, чтобы выбрать, какие поля выполняются и возвращаются. Физически определение и содержимое поля сохраняются в индексе до следующей перестройки с использованием схемы, в которой это поле отсутствует.
Изменение определения поля Для изменения имени поля, типа данных или определенных атрибутов индекса (доступных для поиска, фильтруемых, сортируемых, аспектируемых) требуется полная перестроение.
Присвоение полю анализатора Анализаторы определяются в индексе, назначены полям, а затем вызываются во время индексирования, чтобы сообщить, как создаются маркеры. Вы можете добавить новое определение анализатора в индекс в любое время, но присвоить анализатор можно только при создании поля. Это касается обоих свойств: analyzer и indexAnalyzer. Свойство searchAnalyzer является исключением (его можно присвоить уже существующему полю).
Обновление или удаление определения анализатора в индексе Вы не можете удалить или изменить существующую конфигурацию анализатора (анализатор, токенизатор, фильтр маркеров или фильтр символов) в индексе, если вы не перестроите весь индекс.
Добавление поля в средство подбора Если поле уже существует и вы хотите добавить его в конструкцию предложения , перестройте индекс.
Смена уровня Обновления на месте не поддерживаются. Если требуется дополнительная емкость, создайте новую службу и перестроите индексы с нуля. Чтобы автоматизировать этот процесс, можно использовать пример кода для восстановления индексов в этом примере репозитория .NET для поиска ИИ Azure. Это приложение создает резервную копию индекса в ряде JSON-файлов, а затем повторно создает индекс в указанной службе поиска.

Порядок операций:

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

  2. Рекомендуется использовать решение резервного копирования и восстановления для сохранения копии содержимого индекса. В C# и Python существуют решения. Рекомендуется использовать версию Python, так как она обновлена.

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

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

  4. После изменения индекса, в котором текст запроса включает измененные или измененные определения полей и конфигурации.

  5. Загрузите индекс с документами из внешнего источника. Документы индексируются с помощью определений полей и конфигураций новой схемы.

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

Балансировка рабочих нагрузок

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

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

Проверить наличие обновлений

Вы можете отправлять запросы к индексу сразу после загрузки первого документа. Если вы знаете идентификатор документа, API REST поиска по документу возвращает определенный документ. Для более подробного тестирования подождите полной загрузки индекса, а затем используйте запросы, чтобы проверить контекст, который вы ожидаете увидеть.

Обозреватель поиска или клиент REST можно использовать для проверки обновленного содержимого.

Если вы добавили или переименовали поле, используйте $select для возврата этого поля: search=*&$select=document-id,my-new-field,some-old-field&$count=true

Портал Azure предоставляет размер индекса и размер векторного индекса. Эти значения можно проверить после обновления индекса, но не забудьте ожидать небольшую задержку, так как служба обрабатывает изменение и учетную запись частоты обновления портала, что может занять несколько минут.

Удаление потерянных документов

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

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

  1. Определите, какое поле является ключом документа. На портале можно просмотреть поля каждого индекса. Ключи документа — это строковые поля и обозначены значком ключа, чтобы упростить их место.

  2. Проверьте значения поля ключа документа: search=*&$select=HotelId Простая строка проста, но если индекс использует поле в кодировке Base-64 или если документы поиска были созданы из parsingMode параметра, возможно, вы работаете со значениями, с которыми вы не знакомы.

  3. Просмотрите документ, чтобы проверить значение идентификатора документа и просмотреть его содержимое перед удалением. Укажите ключ или идентификатор документа в запросе. В следующих примерах показана простая строка для примера индекса Hotels и строка в кодировке Base-64 для ключа metadata_storage_path индекса cog-search-demo.

    GET https://[service name].search.windows.net/indexes/hotel-sample-index/docs/1111?api-version=2024-07-01
    
    GET https://[service name].search.windows.net/indexes/cog-search-demo/docs/aHR0cHM6Ly9oZWlkaWJsb2JzdG9yYWdlMi5ibG9iLmNvcmUud2luZG93cy5uZXQvY29nLXNlYXJjaC1kZW1vL2d1dGhyaWUuanBn0?api-version=2024-07-01
    
  4. Удалите документ с помощью удаления @search.action из индекса поиска.

    POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/index?api-version=2024-07-01
    Content-Type: application/json   
    api-key: [admin key] 
    {  
      "value": [  
        {  
          "@search.action": "delete",  
          "id": "1111"  
        }  
      ]  
    }
    

См. также