開發 IFilter 增益集

注意

Windows Desktop Search 2.x 是一種過時的技術,原本可作為 Windows XP 和 Windows Server 2003 的增益集使用。 在較新版本中,請改用 Windows 搜尋

您可以使用實作 IFilter 介面的篩選增益集、實作 IFilter介面的元件,來擴充 Microsoft Windows 桌面搜尋 (WDS) ,以包含新的檔案類型。 篩選準則負責存取和剖析檔案中的資料,以及傳回屬性和值的配對,以及用於編制索引的文字區塊。 在編制索引過程中,WDS 會使用每個檔案或專案的 URL 呼叫適當的篩選。 篩選會先擷取對應至 WDS 架構中標示為可擷取的屬性的中繼資料,例如標題、檔案大小和上次修改日期。 然後,它會將專案內容分成數個文字區塊。 WDS 會將篩選所傳回的屬性和文字新增至目錄。 WDS 可以為任何具有已註冊篩選準則的檔案類型編制索引。

在某些情況下,您不需要撰寫新的篩選。 WDS 2.x 包含超過 200 種專案的篩選, (包括純文字專案,例如 HTML、XML 和原始程式碼檔案,) 並使用與SharePoint Services相同的IFilter技術。 如果您已經針對檔案類型安裝篩選,WDS 可以使用這些現有的篩選來編制此資料的索引。 此外,WDS 包含純文字型檔案類型的一般篩選。 如果您有可由現有SharePoint Services篩選準則或純文字篩選準則處理的檔案類型,您可以將副檔名和篩選 GUID 新增至登錄,讓 WDS 找到並使用它 (請參閱註冊篩選載入宏以取得詳細資訊) 。

不過,如果您有非純文字和專屬資料或檔案格式,則撰寫自訂篩選實作是確保 WDS 可以在目錄中為檔案格式編制索引的唯一方法。 您只能有一個檔案類型的篩選增益集,因此可以覆寫現有的篩選,或讓另一個篩選覆寫特定檔案類型的覆寫。

本節包含下列主題:

必要的篩選介面

篩選增益集必須實作 IFilter介面和下列其中一個介面:

  • IPersistStream - 從資料流程載入資料。 這比使用檔案更安全,因為沒有寫入磁片。 IPersistStream 介面是與 Windows Vista 向前相容性的慣用方法。
  • IPersistFile 介面 - 從檔案載入資料。 Windows Vista 不支援此介面。
  • IPersistStorage 介面 - 從 OLE COM 結構化儲存體載入資料。

篩選增益集會使用這些介面來取得專案的內容,並逐一將內容傳回至索引,直到到達檔案結尾為止。 篩選增益集應該盡可能強固地處理損毀的檔案,以及不符合預期輸入格式的檔案。

IFilter 介面

這是篩選實作的必要介面。 如需詳細資訊,請參閱 IFilter介面參考。

方法 Description
Init() 初始化篩選會話。
GetChunk () 將篩選放在第一個或下一個區塊的開頭,並傳回描述項。
GetText () 從目前的區塊擷取文字。
GetValue() 從目前的區塊擷取屬性值。
BindRegion () 目前保留供內部使用;請勿實作。 這個方法會傳回E_NOTIMPL。

 

IPersistStream

此介面會從資料流程載入檔案,以取得比 IPersistFile 介面 更安全的處理,因為 IPersistStream 篩選器執行的內容不需要開啟磁片上或透過網路開啟任何檔案的許可權。 在存取單一檔案的兩種方法中,這是與 Windows 轉寄相容性的慣用方法。

方法 Description
IsDirty () 檢查是否有變更。 這個方法會在篩選中傳回E_NOTIMPL。
InitNew () 建立新的儲存體。 這個方法會在篩選中傳回E_NOTIMPL。
Load () 從先前儲存物件的資料流來初始化它。
Save () 將物件儲存至指定的資料流程,並指出物件是否應該重設其中途旗標。 這個方法會在篩選中傳回E_NOTIMPL。
GetSizeMax () 傳回儲存物件所需資料流的大小 (以位元組為單位)。 這個方法會在篩選中傳回E_NOTIMPL。

 

IPersistFile

此介面會依絕對路徑載入檔案,且 Windows Vista 不支援。

方法 Description
GetCurFile () 取得與 物件相關聯之檔案的目前名稱。 傳回 Load () 中指定的路徑。
Load () 開啟指定的檔案,並從檔案連接初始化物件。 您可以延遲開啟檔案,直到您需要它為止。
GetClassID () 傳回新檔案類型 (CLSID) 類別識別碼。 您應該使用 uuidgen.exe 來產生唯一的 CLSID。
IsDirty () 只需要在篩選中傳回E_NOTIMPL
Save () 只需要在篩選中傳回E_NOTIMPL
SaveCompleted () 只需要在篩選中傳回E_NOTIMPL

 

IPersistStorage

此介面支援結構化儲存模型,其中每個自主物件都有自己的儲存體,其巢狀于容器的儲存體內。 如同 IPersistFile 介面,此介面會以絕對路徑載入,且 Windows Vista 不支援。

方法 Description
IsDirty () 檢查是否有變更。 這個方法會在篩選中傳回E_NOTIMPL。
InitNew () 建立新的儲存體。 這個方法會在篩選中傳回E_NOTIMPL。
Load () 儲存儲存體。 這個方法會在篩選中傳回E_NOTIMPL。
Save () 傳回儲存物件所需資料流的大小 (以位元組為單位)。 這個方法會在篩選中傳回E_NOTIMPL。
SaveCompleted () 保留供內部使用。 這個方法會在篩選中傳回E_NOTIMPL。
HandsOffStorage () 保留供內部使用。 這個方法會在篩選中傳回E_NOTIMPL。

 

使用篩選輸出屬性

篩選的目的是要擷取檔案的內容和屬性,以包含在全文檢索索引中。 WDS 會先在 IPersistFile、IPersistStream 或 IPersistStorage 實作上呼叫 Load 方法,然後叫用 IFilter 實作的 Init 方法。 系統會呼叫 GetChunk 來擷取文字或屬性值資料的區塊,然後視需要呼叫 GetTextGetValue ,以擷取與區塊相關聯的所有文字或屬性值。 此程式會重複執行,直到 GetChunk 報告檔中沒有更多區塊為止。

GetChunk方法會從篩選的檔案擷取第一個或下一個邏輯資訊區塊的相關資訊,並傳回STAT_CHUNK結構中的資訊,包括單調遞增區塊識別碼、目前區塊與上一個區塊相關的狀態資訊、指出區塊是否包含文字或值的旗標。 區塊的地區設定和區塊的屬性規格。 屬性規格是由 CLSID 和整數或字串屬性識別碼所組成的 FULLPROPSPEC (,例如 D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType) 。 它會識別屬性的類型,而不是屬性值本身。

區塊地區設定識別碼可用來選擇適當的斷詞工具,而且請務必正確識別。 如果篩選無法判斷文字的地區設定,它應該假設使用 GetSystemDefaultLCID提供的預設系統地區設定。 如果您控制檔案格式,而且目前未包含地區設定資訊,您應該新增使用者功能來啟用適當的地區設定識別。 使用不相符的斷詞工具可能會導致使用者的查詢體驗不正確。

GetChunk 只會管理存取區塊,而且不會傳回文字或屬性值本身。 相反地, 對 GetTextGetValue 的後續呼叫會擷取區塊的主體。 GetText 會從目前CHUNK_TEXT區塊傳回 Unicode 字串的文字區塊。 如果目前的區塊太大,可能需要對 GetText 方法進行一個以上的呼叫。 每次呼叫 GetText 方法時,都會擷取緊接最後一次呼叫 GetText 方法文字的文字。 例如,一個呼叫的最後一個字元可以位於單字中間,而下一個呼叫中的第一個字元會繼續該字。 搜尋引擎必須處理這種情況。

GetValue 會傳回 PROPVARIANT 結構中目前CHUNK_VALUE區塊的屬性值,可保存各種不同的資料類型。 GetValue 必須使用 CoTaskMemAlloc 配置 PROPVARIANT 結構本身。 GetValue的呼叫端負責使用 PropVariantClear 釋放 PROPVARIANT 所指向的記憶體,並使用 CoTaskMemFree 釋放結構本身。 如需 PROPVATIVET 的詳細資訊,請參閱 PROPVARIANT 參考。

屬性值

篩選準則應該至少輸出下列屬性,這些屬性是 WDS 結果檢視中的預設資料行。

GUID PROPSPEC 易記名稱 Description
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 PrimaryTitle 顯示此專案的標題。
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 PrimaryAuthors 與此專案最相關聯的人員。
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimaryDate PrimaryDate 專案最重要的日期,例如收到電子郵件的日期或修改檔案。
D5CDD505-2E9C-101B-9397-08002B2CF9AE PerceivedType PerceivedType 正在剖析的檔案類型。 必須符合 WDS 認知類型中列出的其中一種 Windows 桌面搜尋類型。

 

針對純文字專案,WDS 會擷取所有文字和系統定義的屬性,例如檔案大小或副檔名,包括新的純文字檔案類型至索引) 。 可以傳回至索引的其他屬性類型包括:

  • 檔案:作者、標題、狀態、關鍵字
  • 針對媒體:相簿、內容類型、相機製作、取得日期
  • 對於通訊:從、到、副本、重要性
  • 連絡人:職稱、商務電話、公司

上述清單會將指定感知類型通用的屬性分組;不過,不論類型為何,都可以使用任何屬性。 例如,公司可用於連絡人的雇主名稱,也可以用來參考檔案所關聯的用戶端名稱。 其中許多屬性都用來在 WDS 結果檢視中顯示搜尋結果。 例如,檔案的 Title 屬性會顯示為預設結果檢視中的主要資料行。 IFilter 物件應該輸出與其剖析之專案類型相關的所有屬性。 無法在 WDS 2.x 中新增自訂屬性。 如需可用屬性的完整清單,請參閱 WDS 架構

篩選增益集安裝

安裝篩選器牽涉到將 DLL 複製到 Program Files 目錄中的適當位置,並註冊它。 篩選準則應實作安裝自我註冊,並遵循下列指導方針:

  • 安裝程式必須使用 EXE 或 MSI 安裝程式。
  • 必須提供版本資訊。
  • 必須為每個已安裝的增益集建立 [新增/移除程式 ] 專案。
  • 安裝程式必須接管目前增益集瞭解的特定檔案類型或儲存的所有登錄設定。
  • 如果覆寫先前的增益集,安裝程式應該通知使用者。
  • 如果較新的增益集已覆寫先前的增益集,則應該能夠還原先前增益集的功能,並將它設為該檔案類型或儲存的預設增益集。

註冊所需的 CLSID

每個篩選有三個類別識別碼或 CLSID 相關聯。 您必須產生一或多個這些 (使用uuidgen.exe) 來註冊篩選增益集。

  • 第一個會識別所有篩選的持續性處理常式,IID_IFilter,也就是 {89BCB740-6119-101A-BCB7-00DD010655AF}。 這個 CLSID 是實作 IFilter 之所有篩選的常數。
  • 第二個 (IID_IFilter索引鍵的值,) 識別檔案類型的 IFilter 實作。 此機碼包含 InprocServer32 值,這個值會依路徑和執行緒模型指定 DLL 名稱。 如果篩選準則位於系統路徑中,例如 system32 目錄,檔案名就已足夠。 否則,此值應該具有完整的路徑規格。
  • 第三個會識別篩選處理常式的檔案類型,並由 IPersist 介面上的 GetClassID 方法傳回。

注意

在未來版本的 Microsoft 作業系統中,在 system32 目錄中安裝檔案可能會比較困難,因此建議您在 [程式檔] 下安裝它們,並在登錄中包含篩選的完整路徑。 基於安全性考慮,也建議您在登錄中指定 DLL 的完整路徑。 否則,如果 DLL 的「特洛伊木馬」版本在版本之前的進程路徑中,可能會載入它。

 

註冊模型

當 WDS 準備好篩選檔案時,它會在檔案副檔名下的登錄中查看,以判斷要載入的篩選。 接著會遵循一系列登錄連結來尋找篩選 DLL 的名稱,順序如下:

  1. 從位於:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. 從位於下列位置的檔案內容類型:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. 從副檔名 (與 Win32 LoadIFilter API) 位於:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID >>>

  4. 從預設位置:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

註冊篩選增益集

您必須在登錄中總共製作八個專案,以註冊您的篩選增益集,其中:

  • .ext 是新的副檔名
  • GUID_1 可以是針對此延伸模組產生的任何新 GUID
  • 89BCB740-6119-101A-BCB7-00DD010655AF 是 IFilter 介面 GUID,這是所有 IFilter 實作的常數。
  1. 使用下列索引鍵和值註冊副檔名的持續性處理常式:

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. 使用下列索引鍵和值註冊 IFilter 實作:

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. 使用下列索引鍵和值向 Windows 桌面搜尋註冊 IFilter 實作:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

參考

SchemaTable

認知類型

開發通訊協定處理常式

其他資源

IFilter