開發 Windows 搜尋的屬性處理程式

Microsoft Windows 搜尋會使用屬性處理程式從專案擷取屬性值,並使用屬性系統架構來判斷應如何編製特定屬性的索引。 若要讀取和編製屬性值的索引,Windows 搜尋會叫用屬性處理程式,以改善安全性和健全性。 相反地,Windows 檔案總管會叫用屬性處理程式,以讀取和寫入屬性值。

本主題補充 屬性系統 主題,其中包含 Windows 搜尋的特定資訊,並包含下列各節:

 

屬性處理程式的設計決策

實作屬性處理程式牽涉到下列步驟:

  1. 針對您想要支援的屬性做出設計決策。
  2. 針對尚未在屬性系統中的屬性建立屬性描述 (.propdesc) 檔案。
  3. 實作及測試屬性處理程式。
  4. 安裝和註冊屬性處理程式和屬性描述檔案。
  5. 測試屬性處理程式安裝和註冊。

開始之前,您必須考慮下列設計問題:

  • 檔案格式支援哪些屬性?
  • 這些屬性是否已經在系統架構中?
  • 我可以使用現有的系統提供屬性處理程式嗎?
  • 哪些屬性可以向用戶顯示?
  • 用戶可以編輯哪些屬性?
  • 全文搜索的支持應該來自屬性處理程式或篩選?
  • 我需要支援舊版應用程式嗎? 如果是,我要實作什麼?

注意

在繼續之前,請參閱 使用系統提供的屬性處理程式來查看您是否可以使用系統提供的屬性處理程式 ,以節省您的時間和開發資源。

 

完成這些決策之後,您可以撰寫自定義屬性的正式描述,讓 Windows 搜尋引擎可以開始編製檔案和屬性的索引。 這些正式描述是 XML 檔案,如屬性描述架構中所述

屬性決策

考慮要支援哪些屬性時,您應該識別使用者的索引編製和搜尋需求。 例如,您可以識別一百個可能有用的檔類型屬性,但使用者可能只想要搜尋少數屬性。 此外,您可能想要在 Windows 檔案總管中向用戶顯示不同的、較大或更小的屬性群組,並允許使用者只編輯所顯示之屬性的子集。

您的檔案類型可以支援您定義的任何自定義屬性,以及一組系統定義的屬性。 建立自訂屬性之前,請先檢閱 系統屬性 ,以查看您想要支援的屬性是否已由系統屬性定義。 請務必確定您支援最重要的系統定義屬性。

建議您使用矩陣來協助您設計屬性:

屬性名稱 可編製索引嗎? 是否可顯示? 可編輯嗎?
property1 Y Y
財產。。。 Y Y
propertyn N N N

 

針對每個屬性,您必須判斷它應該擁有的屬性,然後在屬性描述 XML 檔案中正式描述它們。。 屬性包括屬性的數據類型、標籤、說明字串等等。 針對可編製索引的屬性,您應該特別注意屬性描述檔案的 searchInfo XML 元素中找到的下列屬性屬性。

屬性 描述
inInvertedIndex 選擇性。 指出字串屬性值是否應該分成單字,以及儲存在反向索引中的每個單字。 反向索引可讓您使用 CONTAINS 或 FREETEXT 在屬性值上有效搜尋單字和片語(例如 SELECT ...WHERE CONTAINS “sometext” 。 如果設定為 FALSE,則會針對整個字串執行搜尋。 大部分的字串屬性都應該將此設定為 TRUE;非字串屬性應該將此設定為 FALSE。 預設值為 FALSE
isColumn 選擇性。 指出屬性是否應該以數據行的形式儲存在 Windows 搜尋資料庫中。 將 屬性儲存為數據行可讓整個數據行值上擷取、排序、分組和篩選(也就是使用 CONTAINS 或 FREETEXT 以外的任何述詞)。 向使用者顯示的屬性應該將此屬性設定為 TRUE ,除非它是非常大的文字屬性(例如檔本文),且會在反向索引中搜尋。 預設值為 FALSE
isColumnSparse 選擇性。 指出如果值為 NULL,屬性是否接受任何空格。 非疏鬆屬性會針對每個專案佔用空間,即使值為 NULL 也一樣。 如果屬性為多重值,則此屬性一律 為 TRUE。 只有當每個專案都有值時,這個屬性才應該是 FALSE 。 預設值為 TRUE
columnIndexType 選擇性。 若要優化查詢,Windows 搜尋引擎可以針對具有 isColumn=TRUE 的屬性建立次要索引。 這在編製索引期間需要更多處理和磁碟空間,但可改善查詢期間的效能。 如果屬性通常由使用者排序、分組或篩選(也就是使用 =、!=、<、>、LIKE、MATCHES),則此屬性應該設定為 “OnDisk”。 預設值為 「NotIndexed」。。 下列值有效:
  • NotIndexed:未建立次要索引。
  • OnDisk:在磁碟上建立和儲存次要索引。
maxSize 選擇性。 指出儲存在 Windows 搜尋資料庫中之屬性值的大小上限。 此限制適用於向量的 indvidual 元素,而不是整個向量。 超出此大小的值會被截斷。 默認值為 “128” (bytes)。
目前,Windows 搜尋在計算從檔案接受的數據量時,不會使用 maxSize。 相反地,Windows 搜尋所使用的限制是檔案大小和 MaxGrowFactor (檔案大小 N * MaxGrowFactor) 從登錄讀取的乘積,HKEY_LOCAL_MACHINE->Software->Microsoft->Windows Search->Gathering Manager->MaxGrowFactor。 默認 MaxGrowFactor 是四個 (4)。 因此,如果您的文件類型大小通常很小,但具有較大的屬性,Windows 搜尋可能不接受您想要發出的所有屬性數據。 不過,您可以增加 MaxGrowFactor 以符合您的需求。

 

注意

針對 columnIndexType 屬性,需要根據次要索引所產生之更大的編製索引時間和空間成本來權衡更快速查詢的優點。 不過,只有具有非 Null 值的專案才會支付此成本,因此大部分屬性都可以將此屬性設定為 “OnDisk”。

 

全文檢索支援

一般而言,稱為 篩選的元件支援全文搜索;不過,對於具有不複雜檔格式的文字型檔類型,屬性處理程式可能會以較少的開發工作來提供這項功能。 您應該檢閱 全文檢索內容 一節,以比較篩選和屬性處理程式功能,以協助您決定最適合檔類型的內容。 特別重要的是,篩選條件可以處理每個檔案的多種語言代碼標識碼(LCID),而屬性處理程式則無法處理。

注意

因為屬性處理程式無法以篩選方式將內容區塊化,所以大型檔案(即使它們不複雜檔格式)必須完全載入記憶體中。

 

操作系統實作考慮

Windows 7 的實作資訊

在 Windows 7 和更新版本中,註冊屬性處理程式、 IFilter 或新的擴充功能時,會有新的行為。 安裝新的屬性處理程式和/或 IFilter 時,會自動重新編製具有對應擴展名的檔案索引。

在 Windows 7 中,建議搭配其對應的屬性處理程式安裝 IFilter,並在屬性處理程式之前註冊 IFilter。 屬性處理程式的註冊會起始先前索引檔案的立即重新編製索引,而不需要重新啟動,並利用任何先前註冊的 IFilter(s) 來編製內容索引。

如果只 安裝 IFilter ,但沒有對應的屬性處理程式,則自動重新編製索引會在索引服務重新啟動或系統重新啟動之後發生。

如需 Windows 7 特有的屬性描述旗標,請參閱下列參考主題:

Windows Vista 和舊版的實作資訊

在 Windows Vista 之前,篩選條件提供剖析和列舉檔案內容和屬性的支援。 隨著屬性系統的引進,屬性處理程式會處理檔案屬性,而篩選會處理檔案內容。 針對 Windows Vista,您只需要開發 IFilter 介面的部分實作,以配合屬性處理程式,如在 Windows 搜尋中建立篩選處理程式的最佳做法中所述。

雖然屬性系統也隨附於適用於 Windows XP 的 Windows 搜尋安裝中,但第三方和舊版應用程式可能需要篩選處理內容和屬性。 因此,如果您要在 Windows XP 平台上開發,您應該提供完整的篩選實作,以及文件類型或自定義屬性的屬性處理程式。

 

寫入屬性描述檔案

propertyDescription 主題會說明屬性描述 XML 檔案的結構。propdesc。 搜尋特別感興趣的是 searchInfo 元素的屬性。 決定支援哪些屬性之後,您必須為每個屬性建立和註冊屬性描述檔案。 當您註冊 .propdesc 檔案時,這些檔案會包含在架構的屬性描述清單中,並成為搜尋引擎屬性存放區中的數據行名稱。

您可以使用 PSRegisterPropertySchema 函式來註冊自定義屬性描述 ,這是呼叫架構子系統 IPropertySystem::RegisterPropertySchema 的包裝函式 API。 此函式會使用本機計算機上的 .propdesc 檔案路徑,通知架構子系統新增屬性描述架構 (.propdesc) 檔案,通常是應用程式在 “Program Files” 底下的安裝目錄。 一般而言,安裝或應用程式(例如,您的屬性處理程式安裝程式)會在安裝 .propdesc 檔案之後呼叫這個方法。

 

實作屬性處理程式

開發屬性處理程式牽涉到實作下列介面:

  • IInitialzeWithStream:提供屬性處理程式的數據流型初始化。
  • IPropertyStore:列舉、取得和設定屬性值。
  • IPropertyStoreCapabilities:選擇性。 識別使用者是否可以從使用者介面編輯屬性。

IInitializeWithStream

如屬性系統主題所述,強烈建議使用 IInitializeWithStream 實作屬性處理程式,以執行以數據流為基礎的初始化。 如果您選擇不實作 IInitializeWithStream,屬性處理程式必須在屬性處理程式的登錄機碼上設定 DisableProcessIsolation 旗標,退出宣告在隔離程式中執行。 停用進程隔離通常僅適用於舊版屬性處理程式,而且應該由任何新程式代碼謹慎避免。

IPropertyStore

若要建立屬性處理程式,您必須使用下列方法實 作 IPropertyStore 介面。

方法 描述
提交 將屬性變更儲存至檔案。
GetAt 從項目的屬性陣列擷取屬性索引鍵。
GetCount 取得附加至檔案的屬性數目。
GetValue 擷取特定屬性的數據。
SetValue 設定新的屬性值,或取代或移除現有的值。

 

 

 

實作此介面的重要考慮包含在 IPropertyStore 檔中。

注意

如果您的屬性處理程式針對指定專案發出相同屬性的多個值,則只會將最後一個發出的值儲存在目錄中。

 

 

IPropertyStoreCapabilities

屬性處理程式可以選擇性地實作這個介面,以停用使用者編輯特定屬性的能力。 這些屬性通常可在 [詳細數據] 頁面和窗格中編輯,但在實作屬性處理程式下不允許編輯這些屬性。 正確實作此介面可提供比替代專案更好的用戶體驗,也就是殼層的簡單運行時間錯誤。

 

確保您的專案已編製索引

既然您已實作屬性處理程式,您想要確定處理程式已註冊以取得索引的專案。 您可以使用目錄 管理員 起始重新編製索引,也可以使用 編目範圍管理員 來設定預設規則,指出索引器要編目的 URL。 另一個選項是遵循 Windows 搜尋程式代碼範例中的 ReIndex 程式代碼範例

如需詳細資訊,請參閱 使用目錄管理員 和使用 編目範圍管理員

 

安裝及註冊屬性處理程式

實作屬性處理程序之後,它必須註冊,且其擴展名與處理程序相關聯。 下列範例顯示執行此動作所需的登錄機碼和值。

HKEY_CLASSES_ROOT
   CLSID
      {<CLSID for property handler>}
         (Default) = <Property Handler Name>
         InProcServer32
            (Default) = <full path to property handler dll>
            ThreadingModel = <your threading model>
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     <.fileextention>
                        (Default) = {<CLSID for property handler>}

 

測試和疑難解答屬性處理程式

下列清單提供您應該執行之測試類型的建議:

  • 測試從檔案類型所支援的每個單一屬性取得輸出。
  • 例如,使用大型屬性值,在 HTML 檔中使用大型中繼標記。
  • 檢查屬性處理程式在取得屬性處理程序的輸出之後,或是在列舉檔案屬性之前和之後使用 oh.exe 之類的工具來編輯檔案句柄,以洩漏檔句柄。
  • 測試與屬性處理程式相關聯的所有檔案類型。 例如,檢查 HTML 篩選器是否適用於 .htm 和 .html 檔案類型。
  • 使用損毀的檔案進行測試。 屬性處理程序應該會正常失敗。
  • 如果應用程式支援加密,請測試屬性處理程式不會輸出加密的文字。
  • 如果您的屬性處理程式支援全文搜尋:
    • 在檔案內容中使用多個特殊的 Unicode 字元,並測試其輸出。
    • 測試處理非常大的檔,以確保屬性處理程式如預期般運作。

安裝和安裝測試

最後,您必須測試安裝和卸載例程。

  • 安裝必須從失敗的安裝中復原(例如,從取消再重新啟動安裝程式)。
  • 卸載必須刪除與屬性處理程式相關聯的所有檔案。
  • 卸載不可刪除與屬性處理程式安裝相關聯的檔案。
  • 卸載時,必須移除與屬性處理程式相關聯的登錄機碼。
  • 即使從安裝目錄刪除檔案,卸載也必須正常運作。

疑難解答屬性處理程式

以下是開發屬性處理程式時所發生的一些常見錯誤:

  • 在使用者目錄下安裝 .propdesc 檔案或 DLL。
  • 使用相對路徑註冊元件。
  • 在 HKEY_CURRENT_USER 底下註冊元件,而不是HKEY_LOCAL_MACHINE。
  • 忘記為非數據流處理程式設定 DisableProcessIsolation。
  • 將測試檔案放在未編製索引的位置。

如果您無法讓屬性處理程式使用索引器,以下是協助您進行疑難解答的一些秘訣:

  • 確認屬性描述 (.propdesc 檔案) 已標示為Column=“true”、isViewable=“true”,並視情況標示為 isQueryable=“true”。
  • 確認您的 .propdesc 檔案位於全域位置。
  • 確認您已使用絕對路徑註冊 .propdesc 檔案。
  • 確認事件記錄檔未記錄註冊 .propdesc 檔案的任何失敗。
  • 確認您的 DLL 位於全域位置(而不是您的使用者設定檔底下)。
  • 確認您的 DLL 已在 HKEY_LOCAL_MACHINE\Software\Classes 下註冊。
  • 確認您的 DLL 是使用完整路徑註冊的(或REG_EXPAND_SZ字串串,這些字串會使用系統帳戶已知的環境變數擴充至絕對路徑)。
  • 確認您的屬性處理程式可在 Windows 檔案總管下運作。
  • 雖然我們建議使用 IInitializeWithStream,但如果您必須使用 IInitializeWithFile 或 IInitializeWithItem,請確認您指定 DisableProcessIsolation。
  • 確認 [索引選項] 控制台 將檔類型列為索引文件類型。
  • 確認測試檔案位於索引位置。
  • 確認自您安裝屬性處理程序之後,測試檔案已修改。

如果您的測試檔案位於索引位置,而且索引器已經編目該位置,您必須以某種方式修改檔案,以觸發檔案的重新編製索引。

 

使用系統提供的屬性處理程式

Windows 包含一些系統提供的屬性處理程式,您可以在檔案類型的格式相容時使用。 如果您定義使用下列其中一種格式的新擴展名,您可以註冊擴展名的處理程式類別識別元 (CLSID) 來使用系統提供的處理程式。

您可以使用下表所列的 CLSID,為您的檔案格式類型註冊系統提供的屬性處理程式。

格式 CLSID
OLE DocFile {8d80504a-0826-40c5-97e1-ebc68f953792}
儲存遊戲 XML {ECDD6472-2B9B-4b4b-AE36-F316DF3C8D60}
XPS/OPC 處理程式 {45670FA8-ED97-4F44-BC93-305082590BFB}
XML {c73f6f30-97a0-4ad1-a08f-540d4e9bc7b9}

 

在建立自定義屬性之前,您應該確定沒有系統定義的屬性可供改用。 您可以呼叫 PSEnumeratePropertyDescriptions 或使用 prop.exe 命令行工具來列舉系統定義的屬性。

系統架構會定義這些屬性如何與索引器互動,而且您無法變更該屬性。 此外,您用來建立、編輯和儲存檔案類型的應用程式也必須符合特定行為。 例如,如果應用程式實作安全儲存(在編輯期間建立臨時檔,然後使用 ReplaceFile() 來交換舊版,則必須將所有屬性從源檔傳輸到新檔案。 無法執行表示檔案會遺失使用者或其他應用程式新增的屬性。

 

範例

以下顯示使用 之檔類型之系統提供的 OLE DocFile 處理程序註冊。OLEDocFile 延伸模組。

HKEY_CLASSES_ROOT
   SystemFileAssociations
      .OLEDocFile
         shellex
            {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
               (Default) = {9DBD2C50-62AD-11d0-B806-00C04FD706EC}

下列顯示屬性清單資訊的註冊,因此 屬性的屬性為 。OLEDocFile 檔案會顯示在 [詳細數據] 索引卷標和窗格上。

HKEY_CLASSES_ROOT
   SystemFileAssociations
      .OLEDocFile
         ExtendedTileInfo = prop:System.ItemType;System.Size;System.DateModified;System.Author;System.OfflineAvailability
         FullDetails = prop:System.PropGroup.Description;System.Title;System.Subject;
System.Keywords;System.Category;System.Comment;System.PropGroup.Origin;
System.Author;System.Document.LastAuthor;System.Document.RevisionNumber;
System.Document.Version;System.ApplicationName;System.Company;System.Document.Manager;
System.Document.DateCreated;System.Document.DateSaved;System.Document.DatePrinted;
System.Document.TotalEditingTime;System.PropGroup.Content;System.ContentStatus;
System.ContentType;System.Document.PageCount;System.Document.WordCount;
System.Document.CharacterCount;System.Document.LineCount;
System.Document.ParagraphCount;System.Document.Template;System.Document.Scale;
System.Document.LinksDirty;System.Language;System.PropGroup.FileSystem;
System.ItemNameDisplay;System.ItemType;System.ItemFolderPathDisplay;
System.DateCreated;System.DateModified;System.Size;System.FileAttributes;
System.OfflineAvailability;System.OfflineStatus;System.SharedWith;
System.FileOwner;System.ComputerName
         InfoTip = prop:System.ItemType;System.Size;System.DateModified;System.Document.PageCoun
         PerceivedType = document
         PreviewDetails = prop:*System.DateModified;System.Author;System.Keywords;
*System.Size;System.Title;System.Comment;System.Category;
*System.Document.PageCount;System.ContentStatus;System.ContentType;
*System.OfflineAvailability;*System.OfflineStatus;System.Subject;
*System.DateCreated;*System.SharedWith

 

參考

屬性對應

概念

在 Windows 搜尋中建立篩選處理程式的最佳做法

編製索引程式

開發通訊協議處理程式

自訂檔案格式的系統定義屬性

其他資源

屬性系統

系統屬性

Windows 搜尋程式代碼範例