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


Уведомление индекса изменений (Windows Search)

С помощью компонентов API уведомлений можно уведомлять индексатор о том, что элемент был изменен, перемещен или удален, а также добавлять области поиска в очередь URL-адресов индексатора Windows Search, для которых требуется индексирование.

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

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

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

Чтобы реализовать уведомления, управляемые индексатором, необходимо реализовать следующее:

  • Механизм мониторинга изменений в хранилище данных.
  • Структура данных для постановки в очередь сведений об этих изменениях (несколько SEARCH_ITEM_PERSISTENT_CHANGE структур).
  • Интерфейс ISearchPersistentItemsChangedSink для отправки уведомлений индексатору и получения подтверждений уведомлений от индексатора.

Очередь уведомлений

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

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

ISearchPersistentItemsChangedSink

Чтобы получить доступ к этому интерфейсу, сначала создайте экземпляр объекта ISearchManager , чтобы получить доступ к объекту ISearchCatalogManager . Из этого объекта ISearchCatalogManager создается экземпляр объекта ISearchPersistentItemsChangedSink и уведомляется индексатор об изменениях данных с помощью вызова метода OnItemsChanged .

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

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

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

Чтобы реализовать уведомления, управляемые поставщиком, необходимо реализовать следующее:

  • Механизм мониторинга изменений в хранилище данных.
  • Структура данных для постановки в очередь сведений (несколько SEARCH_ITEM_CHANGE структур) об этих изменениях.
  • Интерфейс ISearchItemsChangedSink для отправки уведомлений индексатору и получения подтверждений уведомлений от индексатора.
  • Интерфейс ISearchNotifyInlineSite для получения обновлений о состоянии индексирования.

Очередь уведомлений

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

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

ISearchItemsChangedSink

Чтобы получить доступ к этому интерфейсу, сначала создайте экземпляр объекта ISearchManager , чтобы получить доступ к объекту ISearchCatalogManager . Из этого объекта ISearchCatalogManager вы создаете экземпляр объекта ISearchItemsChangedSink и уведомляете индексатора об изменениях данных с помощью вызова метода OnItemsChanged .

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

С этого момента индексатор отправляет обновления с помощью интерфейса ISearchNotifyInlineSite .

ISearchNotifyInlineSite

Чтобы получать обновления о состоянии элементов и каталога, необходимо зарегистрировать интерфейс ISearchNotifyInlineSite в индексаторе, чтобы он смог отправлять обратные вызовы. Каждое обновление, отправленное с помощью ISearchNotifyInlineSite::OnItemIndexedStatusChange , определяет элементы по DocId, состояние каждого элемента (SEARCH_ITEM_INDEXING_STATUS) и этап индексирования (SEARCH_INDEXING_PHASE), в котором находятся элементы.

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

Метод ISearchNotifyInlineSite::OnCatalogStatusChange, вызываемый служба Windows, информирует клиентов о состоянии каталога с помощью параметров, описанных в следующей таблице.

Параметр Описание
guidCatalogResetSignature GUID, представляющий сброс каталога. Если этот GUID изменяется, все уведомления должны быть повторно отправлены.
guidCheckPointSignature GUID, представляющий последнюю восстановленную контрольную точку. Если этот GUID изменяется, все уведомления, накопленные с момента последней сохраненной контрольной точки, должны быть повторно возвращены.
dwLastCheckPointNumber Число, указывающее последнюю сохраненную контрольную точку.

 

 

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

Если происходит восстановление каталога, служба поиска выполняет откат каталога до последней сохраненной контрольной точки и обновляет guidCheckPointSignature. В этом случае поставщики уведомлений должны повторять все уведомления, накопленные с момента последней сохраненной контрольной точки, как определено dwLastCheckPointNumber.

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

Дополнительные ресурсы

Основные понятия

Разработка обработчиков протоколов

Основные сведения об обработчиках протоколов

Добавление значков и контекстных меню

Пример кода. Расширения оболочки для обработчиков протоколов

Установка и регистрация обработчиков протоколов

Создание соединителя поиска для обработчика протокола

Обработчики протокола отладки