通知 (Windows 搜索) 的更改索引
通过使用通知 API,组件可以通知索引器项已更改、移动或删除,并且可以将搜索范围添加到 Windows 搜索索引器需要索引的 URL 队列。
组件可以通知 Windows 搜索索引器其存储中的数据已更改。 通常,可以依赖于索引器的计划爬网。 但是,通过确保索引器不会对增量索引上的整个存储进行爬网,向索引器提供通知可以提高性能。 例如,如果你希望数据存储非常大和/或异常繁忙,例如电子邮件数据存储,则建议这样做。
实现索引器管理的通知
索引器管理的通知使你能够控制对数据存储的访问,同时解放你在整个索引过程中维护通知队列。 通知提供程序必须监视对数据存储的更改并创建通知队列。 提供程序会定期向索引器发送一批更改通知。 当索引器收到通知时,它会返回确认,你可以从队列中删除项 () 。 如果在一段时间后未收到确认,可以重新发送通知。 如果发生故障,索引器会重新生成其内部项队列以爬网或对存储执行增量爬网。
若要实现索引器管理的通知,需要实现以下各项:
- 用于监视数据存储中更改的机制。
- 一种数据结构,用于 (多个 SEARCH_ITEM_PERSISTENT_CHANGE 结构) 有关这些更改的信息排队。
- ISearchPersistentItemsChangedSink 接口,用于将通知发送到索引器并从索引器获取通知确认。
通知队列
需要监视数据存储中的每个更改并将其排队,以通知的形式发送到索引器。 你排队通知的次数以及发送到索引器的频率取决于你的情况。 也许你为每 n 个更改数发送一批通知,或者在一段 t 时间间隔后发送一批通知,或者两者的组合。
索引器希望通知以 SEARCH_ITEM_PERSISTENT_CHANGE 结构数组形式出现,因此可以选择以类似的方式实现队列。
ISearchPersistentItemsChangedSink
若要访问此接口,首先实例化 ISearchManager 对象以获取对 ISearchCatalogManager 对象的访问权限。 在该 ISearchCatalogManager 对象中,可以实例化 ISearchPersistentItemsChangedSink 对象,并通过调用 OnItemsChanged 方法通知索引器数据更改。
在对此方法的调用中,包括报告的更改数和 SEARCH_ITEM_PERSISTENT_CHANGE 结构的数组。 返回一个 HR 完成代码数组,指示是否接受每个 URL 进行索引。 这是来自索引器的确认。
实现提供程序管理的通知
提供程序管理的通知使你能够控制对数据存储的访问,并在索引器更新 Windows 搜索目录时监视索引器的进度。 提供程序必须监视对数据存储的更改并创建通知队列。 提供程序会定期向索引器发送一批更改通知。 当索引器收到通知时,它将返回确认。 如果在一段时间后未收到确认,可以重新发送通知。 当索引器对数据存储进行爬网并更新 Windows 搜索目录时,它会通知你的提供程序每个目录更新,你可以从队列中删除项 () 。 提供程序在整个过程中维护其通知队列,以便在发生故障时,你可以将通知重新发送到索引器。
若要实现提供程序管理的通知,需要实现以下各项:
- 用于监视数据存储中更改的机制。
- 用于 (多个 SEARCH_ITEM_CHANGE 结构) 有关这些更改的信息排队的数据结构。
- ISearchItemsChangedSink 接口,用于将通知发送到索引器并从索引器获取通知确认。
- ISearchNotifyInlineSite 接口,用于接收有关索引编制状态的更新。
通知队列
需要监视数据存储中的每个更改并将其排队,以通知的形式发送到索引器。 你排队通知的次数以及发送到索引器的频率取决于你的情况。 也许你为每 n 个更改数发送一批通知,或者在一段 t 时间间隔后发送一批通知,或者两者的组合。
索引器希望通知以 SEARCH_ITEM_CHANGE 结构数组形式出现,因此你可以选择以类似的方式存储更改信息。 但是,你还需要能够将发送的通知与索引器返回的确认和更新相匹配。 你可能还希望能够检测获得确认所需的时间,以便决定是否/何时重新发送通知。
ISearchItemsChangedSink
若要访问此接口,首先实例化 ISearchManager 对象以获取对 ISearchCatalogManager 对象的访问权限。 在该 ISearchCatalogManager 对象中,实例化 ISearchItemsChangedSink 对象,并通过调用 OnItemsChanged 方法通知索引器数据更改。
在对此方法的调用中,包括报告的更改数和 SEARCH_ITEM_CHANGE 结构的数组。 返回一个索引器分配的 DocId 数组,该数组表示每个更改,以及一个 HR 完成代码数组,指示是否接受每个 URL 进行索引编制。 这是你从索引器确认它已收到通知并准备为项目编制索引。
从此,索引器使用 ISearchNotifyInlineSite 接口发送更新。
ISearchNotifyInlineSite
若要获取有关项目和目录状态的更新,必须将 ISearchNotifyInlineSite 接口注册到索引器,以便它可以向你发送回调。 使用 ISearchNotifyInlineSite::OnItemIndexedStatusChange 发送的每个更新都按 DocId 标识项目、每个项的状态 (SEARCH_ITEM_INDEXING_STATUS) ,以及索引阶段 () 项SEARCH_INDEXING_PHASE 。
如前所述,你不仅会收到有关每个项的状态的更新,还会收到有关目录本身状态的重要信息。 最终用户、第三方应用程序或其他一些故障可能会中断或重启 Windows 搜索服务。 发生这种情况时,需要一种方法来确定要向索引器重新发送哪些通知。
由 Windows 搜索服务调用的 ISearchNotifyInlineSite::OnCatalogStatusChange 方法使用下表中所述的参数通知客户端目录的状态。
参数 | 说明 |
---|---|
guidCatalogResetSignature | 表示目录重置的 GUID。 如果此 GUID 发生更改,则必须重新发送所有通知。 |
guidCheckPointSignature | 表示还原的最后一个检查点的 GUID。 如果此 GUID 发生更改,则必须重新发送自上次保存检查点以来累积的所有通知。 |
dwLastCheckPointNumber | 指示保存的最后一个检查点的数字。 |
发生目录检查点时,搜索服务会更新 dwLastCheckPointNumber,并且在该检查点之前发送的所有通知在服务发生故障时都是安全的且可恢复的。 通知提供程序只需跟踪在检查点和重复项之间发送的通知,以防目录还原或重置。
如果发生目录还原,搜索服务会将目录回滚到上次保存的检查点,并更新 guidCheckPointSignature。 在这种情况下,通知提供程序必须重新配置自 dwLastCheckPointNumber 标识的最新保存检查点以来累积的所有通知。
如果应进行目录重置,搜索服务将重置整个目录并更新 guidCatalogResetSignature。 通知提供程序必须再次重新配置其整个爬网范围。
其他资源
- 有关索引过程的概述,请参阅 索引过程。
- 有关目录管理器和目录搜索管理器 (CSM) 的概述,请参阅 使用目录管理器 和使用 爬网范围管理器。
- 有关创建 Shell 数据存储的信息,请参阅 实现基本文件夹对象接口。
相关主题