共用方式為


通知索引變更(Windows 搜尋)

藉由使用通知 API 元件,可以通知索引器專案已變更、移動或刪除,而且可以將搜尋範圍新增至需要編製索引的 Windows 搜尋索引器 URL 佇列。

元件可以通知 Windows 搜尋服務索引器其存放區中的數據已變更。 一般而言,您可以依賴索引器排程的爬網。 不過,提供通知給索引器可以藉由確保索引器不會在累加索引上搜耙整個存放區,以改善效能。 例如,如果您預期數據存放區非常大且/或異常忙碌,例如電子郵件數據存放區,則建議您這麼做。

實施索引器管理的通知

索引器管理的通知可讓您控制資料存放區的存取權,並且讓您在整個索引過程中無需維護通知佇列。 您的通知提供者必須監視數據存放區的變更,並建立通知佇列。 您的提供者會定期將一批變更通知傳送至索引器。 當索引器收到您的通知時,它會傳回通知,而且您可以從佇列中移除專案。 如果您在一段時間后未收到通知,您可以重新傳送通知。 如果失敗,索引器會重建其內部項目佇列以進行索引,或者執行存放區的增量編目。

若要實作索引器管理的通知,您需要實作下列專案:

通知序列

您必須監視並排入數據存放區中每個變更的佇列,以通知傳送至索引器。 您排入佇列的通知數目,以及您傳送至索引器的頻率取決於您的情況。 或許您會在每 n 次 變更後,或經過若干 t 時間間隔,或兩者的組合後,傳送一批通知。

索引器預期通知會出現在 SEARCH_ITEM_PERSISTENT_CHANGE 結構的陣列中,因此您可以選擇以類似的方式實作佇列。

ISearchPersistentItemsChangedSink

若要存取這個介面,您必須先具現化 ISearchManager 物件,以存取 ISearchCatalogManager 物件。 從該 ISearchCatalogManager 物件中,您可以具現化 ISearchPersistentItemsChangedSink 物件,並使用呼叫 OnItemsChanged 方法通知索引器數據變更。

在呼叫此方法時,您會包含所報告的變更數目,以及 SEARCH_ITEM_PERSISTENT_CHANGE 結構的陣列。 您會收到一個 HR 完成代碼的陣列,指示是否接受了每個 URL 進行索引編制。 這是您收到的來自索引器的確認。

實施由提供者管理的通知

提供者管理的通知可讓您控制數據存放區的存取,並在更新 Windows 搜尋目錄時監視索引器進度。 您的提供者必須監視數據存放區的變更,並建立通知佇列。 您的提供者會定期將一批變更通知傳送至索引器。 當索引器收到通知時,它會傳回通知。 如果您在一段時間后未收到通知,您可以重新傳送通知。 當索引器爬行數據存放區並更新 Windows 搜尋目錄時,它會通知您的提供者有目錄更新,而您可以從佇列中移除項目。 您的提供者會在整個程式中維護其通知佇列,以便在失敗時,您可以將通知重新傳送至索引器。

若要實作提供者管理的通知,您需要實作下列專案:

通知佇列

您需要監控您的數據存放區中的每個變更,並將其排入佇列,以通知方式傳送至索引器。 您排入佇列的通知數目,以及您傳送至索引器的頻率取決於您的情況。 或許您會在每 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。 通知提供者必須再次重新推送其整個抓取範圍。

其他資源

概念

開發通訊協定處理程式

瞭解通訊協定處理程式

新增圖示和內容功能表

程式代碼範例:通訊協定處理程式的殼層延伸模組

安裝和註冊通訊協定處理程式

為通訊協定處理程式建立搜尋連接器

偵錯通訊協定處理程式