開發 Windows 搜尋的屬性處理程式
Microsoft Windows 搜尋會使用屬性處理程式從專案擷取屬性值,並使用屬性系統架構來判斷應如何編製特定屬性的索引。 若要讀取和編製屬性值的索引,Windows 搜尋會叫用屬性處理程式,以改善安全性和健全性。 相較之下,Windows 檔案總管會在程序中叫用屬性處理程式,以讀取和寫入屬性值。
本主題會補充 屬性系統 主題,其中包含 Windows 搜尋的特定資訊,並包含下列各節:
屬性處理程式的設計決策
實作屬性處理程式牽涉到下列步驟:
- 針對您想要支援的屬性做出設計決策。
- 針對尚未在屬性系統中的屬性建立屬性描述 (.propdesc) 檔案。
- 實作及測試屬性處理程式。
- 安裝和註冊屬性處理程式和屬性描述檔案。
- 測試屬性處理程式的安裝和註冊過程。
開始之前,您必須考慮下列設計問題:
- 檔案格式支援哪些屬性?
- 這些屬性是否已經在系統架構中?
- 我可以使用現有的系統提供屬性處理程式嗎?
- 哪些屬性可以向用戶顯示?
- 用戶可以編輯哪些屬性?
- 全文搜索的支持應該來自屬性處理程式或篩選?
- 我需要支援舊版應用程式嗎? 如果是,我要實作什麼?
注意
在繼續之前,請參閱 使用 System-Supplied 屬性處理程式 查看您是否可以使用系統提供的屬性處理程式,以節省您的時間和開發資源。
完成這些決策之後,您可以撰寫自定義屬性的正式描述,讓 Windows 搜尋引擎可以開始編製檔案和屬性的索引。 這些正式描述是 XML 檔案,如 屬性描述架構中所述。
房產決策
考慮要支援哪些屬性時,您應該識別使用者的索引編製和搜尋需求。 例如,您可以識別一百個可能有用的檔類型屬性,但使用者可能只想要搜尋少數屬性。 此外,您可能想要在 Windows 檔案總管中向用戶顯示不同的、較大或更小的屬性群組,並允許使用者只編輯所顯示之屬性的子集。
您的檔案類型可以支援您定義的任何自定義屬性,以及一組系統定義的屬性。 建立自訂屬性之前,請先檢閱 系統屬性,以查看您想要支援的屬性是否已由系統屬性定義。 請務必確定您支援最重要的系統定義屬性。
建議您使用矩陣來協助您設計屬性:
屬性名稱 | 可編製索引嗎? | 是否可顯示? | 可編輯嗎? |
---|---|---|---|
屬性1 | Y | Y | N |
財產。。。 | Y | Y | N |
財產 / 屬性 (depending on the intended meaning of "propertyn") | N | N | N |
針對每個屬性,您必須判斷它應該擁有的屬性,然後在屬性描述 XML 檔案中正式描述它們。。 屬性包括屬性的數據類型、標籤、說明字串等等。 針對可編制索引的屬性,您應該特別注意屬性描述檔案的 searchInfo XML 元素中記載的下列屬性。
屬性 | 描述 |
---|---|
inInvertedIndex | 自選。 判斷字串屬性值是否應該被拆分成單字,並將每個單字儲存在反向索引中。 反向索引讓您能有效地在屬性值中使用 CONTAINS 或 FREETEXT 搜尋字詞和片語(例如:SELECT ... WHERE CONTAINS "sometext")。 如果設定為 FALSE,則會針對整個字元串執行搜尋。 大部分的字串屬性都應該將此設定為 TRUE;非字串屬性應該將此設定為 FALSE。 預設值為 FALSE。 |
是否為欄 | 自選。 指出屬性是否應該以數據行的形式儲存在 Windows 搜尋資料庫中。 將屬性儲存為欄可讓在整個欄位值上進行擷取、排序、分組和篩選(也就是使用任何不是 CONTAINS 或 FREETEXT 的述詞)。 向用戶顯示的屬性應該將此設定為 TRUE,除非它是非常大型的文字屬性(例如文件正文),才會在反向索引中搜尋。 預設值為 FALSE。 |
isColumnSparse | 自選。 指出屬性在值為 NULL時是否不占用空間。 一個非疏鬆屬性即使值為 NULL,也會佔用每個項目的空間。 如果屬性是多重值,則此屬性一律 TRUE。 只有當每個項目有值存在時,此屬性才應該 FALSE。 預設值為 true 。 |
欄索引類型 | 自選。 若要優化查詢,Windows 搜尋引擎可以針對具有 isColumn= 的屬性建立次要索引,TRUE。 這在編製索引期間需要更多處理和磁碟空間,但可改善查詢期間的效能。 如果屬性傾向於依使用者經常排序、分組或篩選(也就是使用 =、!=、<, >、LIKE、MATCHES),此屬性應該設定為 “OnDisk”。 預設值為 「NotIndexed」。。 下列值有效:
|
最大尺寸 | 自選。 指出儲存在 Windows 搜尋資料庫中之屬性值的大小上限。 此限制適用於向量的個別元素,而不是整個向量。 超出此大小的值會被截斷。 默認值為 “128” (bytes)。 目前,Windows 搜尋在計算從檔案接受的數據量時,不會使用 maxSize。 相反地,Windows 搜尋所使用的限制是檔案大小與 MaxGrowFactor 的乘積(檔案大小 N * MaxGrowFactor),這些值是從登錄中的 HKEY_LOCAL_MACHINE->Software->Microsoft->Windows Search->收集管理員->MaxGrowFactor 讀取的。 默認 MaxGrowFactor 是四個 (4)。 因此,如果您的文件類型大小通常很小,但具有較大的屬性,Windows 搜尋可能不接受您想要發出的所有屬性數據。 不過,您可以增加 MaxGrowFactor 以符合您的需求。 |
注意
針對 columnIndexType 屬性,需要根據次要索引所產生之更大的編製索引時間和空間成本來權衡更快速查詢的優點。 不過,只有非null 值的項目才需要支付此成本,因此,大多數屬性可以將這個屬性設定為 "OnDisk"。
Full-Text 支援
一般而言,稱為 篩選的元件支援全文搜索;不過,對於具有不複雜檔格式的文字型檔類型,屬性處理程式可能會以較少的開發工作來提供這項功能。 您應該檢閱 Full-Text Contents 區段,以比較篩選和屬性處理程式功能,以協助您決定最適合檔類型的內容。 特別重要的是,篩選條件可以處理每個檔案的多種語言代碼標識碼(LCID),而屬性處理程式則無法處理。
注意
因為屬性處理程式無法以篩選方式將內容區塊化,所以大型檔案(即使它們不複雜檔格式)必須完全載入記憶體中。
作業系統實施上的考量
Windows 7 的實作資訊
在 Windows 7 和更新版本中,註冊屬性處理程式、IFilter或新的擴充功能時,會有新的行為。 安裝新的屬性處理程式和/或 IFilter 時,會自動重新編製具有對應擴展名的檔案。
在 Windows 7 中,建議與對應的屬性處理程式一起安裝 IFilter,並在屬性處理程式之前註冊 IFilter。 屬性處理程式的註冊會立即啟動先前已建立索引的檔案的重新索引,而不需要重新啟動,並利用任何先前註冊的多個 IFilter 來進行內容索引。
如果只安裝 IFilter,如果沒有對應的屬性處理程式,則自動重新編製索引會在索引服務重新啟動或系統重新啟動之後發生。
如需 Windows 7 特有的屬性描述旗標,請參閱下列參考主題:
Windows Vista 和舊版的實作資訊
在 Windows Vista 之前,篩選條件提供剖析和列舉檔案內容和屬性的支援。 隨著屬性系統的引進,屬性處理程式會處理檔案屬性,而篩選會處理檔案內容。 針對 Windows Vista,您只需要開發與屬性處理程式協調的 IFilter介面的部分實作,如在 Windows 搜尋 中建立篩選處理程式的最佳做法中所述。
雖然屬性系統也隨附於適用於 Windows XP 的 Windows 搜尋安裝中,但第三方和舊版應用程式可能需要篩選處理內容和屬性。 因此,如果您要在 Windows XP 平台上開發,您應該提供完整的篩選實作,以及文件類型或自定義屬性的屬性處理程式。
寫入屬性描述檔案
屬性描述 XML 檔案的結構會在 propertyDescription 主題中描述。 對搜尋特別感興趣的是 searchInfo 元素的屬性。 決定支援哪些屬性之後,您必須為每個屬性建立和註冊屬性描述檔案。 當您註冊 .propdesc 檔案時,這些檔案會包含在架構的屬性描述清單中,並成為搜尋引擎屬性存放區中的數據行名稱。
您可以使用 PSRegisterPropertySchema 函式來註冊自定義屬性描述,這是呼叫架構子系統 IPropertySystem::RegisterPropertySchema 的包裝函式 API。 此函式會使用本機計算機上的 .propdesc 檔案路徑,通知架構子系統新增屬性描述架構 (.propdesc) 檔案,通常是應用程式在 “Program Files” 底下的安裝目錄。 一般而言,安裝或應用程式(例如,您的屬性處理程式安裝程式)會在安裝 .propdesc 檔案之後呼叫這個方法。
實作屬性處理程式
開發屬性處理程式牽涉到實作下列介面:
- IInitializeWithStream:提供您的屬性處理程式的基於流的初始化。
- IPropertyStore:列舉、取得和設定屬性值。
- IPropertyStoreCapabilities:選擇性。 識別使用者是否可以從使用者介面編輯屬性。
IInitializeWithStream
如 屬性系統 主題所述,強烈建議使用 IInitializeWithStream 實作屬性處理程式,以執行數據流型初始化。 如果您選擇不實作 IInitializeWithStream,屬性處理程式必須透過在其登錄機碼上設定 DisableProcessIsolation 旗標,選擇不在隔離程序中執行。 停用進程隔離通常僅適用於舊版屬性處理程式,而且應該由任何新程式代碼謹慎避免。
IPropertyStore
若要建立屬性處理程式,您必須使用下列方法實作 IPropertyStore 介面。
方法 | 描述 |
---|---|
提交 | 將屬性變更儲存至檔案。 |
GetAt | 從項目的屬性陣列擷取屬性索引鍵。 |
GetCount | 取得附加至檔案的屬性數量。 |
GetValue | 擷取特定屬性的數據。 |
設定值 | 設定新的屬性值,或取代或移除現有的值。 |
實作此介面的重要考慮包含在 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 檔案)的標示為 isColumn="true",isViewable="true",以及 isQueryable="true" 是否適當。
- 確認您的 .propdesc 檔案位於全域位置。
- 確認您已使用絕對路徑註冊 .propdesc 檔案。
- 確認事件記錄檔未記錄註冊 .propdesc 檔案的任何失敗。
- 確認您的 DLL 位於全域位置(而不是您的使用者設定檔底下)。
- 確認您的 DLL 已在 HKEY_LOCAL_MACHINE\Software\Classes下註冊。
- 確認您的 DLL 是使用完整路徑註冊的(或REG_EXPAND_SZ字串串,這些字串會使用系統帳戶已知的環境變數擴充至絕對路徑)。
- 確認您的屬性處理程式可在 Windows 檔案總管中正常運作。
- 雖然我們建議使用 IInitializeWithStream,但如果您必須使用 IInitializeWithFile 或 IInitializeWithItem,請確認您指定 DisableProcessIsolation。
- 確認 [索引選項] 控制面板將您的文件類型列為已編製索引的文件類型。
- 確認測試檔案位於索引位置。
- 確認自您安裝屬性處理程序之後,測試檔案已修改。
如果您的測試檔案位於索引位置,而且索引器已經編目該位置,您必須以某種方式修改檔案,以觸發檔案的重新編製索引。
使用 System-Supplied 屬性處理程式
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 搜尋服務中建立篩選處理程式的 最佳做法
-
其他資源