了解 Windows 搜尋中的篩選處理常式

篩選處理常式是 IFilter 介面的實作,會掃描檔中的文字和屬性。 篩選處理常式會從這些專案擷取文字區塊,篩選掉內嵌格式,並保留文字位置的相關資訊。 它們也會擷取值區塊,這些值是文件屬性。 IFilter 是建置較高層級應用程式的基礎,例如檔索引子和與應用程式無關的檢視器。

本主題的組織方式如下:

關於 IFilter 介面

Microsoft Windows 搜尋會使用篩選器來擷取項目的內容,進而納入全文檢索索引中。 您可以藉由撰寫過濾器來擷取內容,以及使用屬性處理程序來擷取檔案的屬性,以擴充 Windows 搜尋功能,使其能夠為新的或專屬的檔案類型編製索引。

IFilter 介面旨在滿足全文搜尋引擎的特定需求。 Windows 搜尋 (例如) 全文檢索搜尋引擎會呼叫 IFilter 方法來擷取文字和屬性資訊,並將其新增至索引。 Windows 搜尋會將傳回的 IFilter::GetText 方法的結果分成單字、正規化它們,並將它們儲存在索引中。 如果可用,搜尋引擎會使用文字區塊的語言代碼識別碼 (LCID) 來執行語言特定的斷詞和正規化。

Windows 搜尋會使用下表所述的三個函式來存取已註冊的篩選處理常式 ( IFilter 介面的實作) 。 這些函式在載入並繫結至內嵌物件的篩選處理常式時特別有用。

功能 Description
載入IFilter 獲得與指定內容類型最相符的 IFilter 指標。
BindIFilterFromStorage 取得最適合 IStorage 介面物件中所包含內容的 IFilter 指標。
BindIFilterFromStream 取得指向IFilter的指標,該指標最適合用來從流變數中擷取指定的類別識別碼(CLSID)。

IFilter 介面有五個方法,如下表所述。

方法 Description
IFilter::初始化 初始化篩選會話。
IFilter::GetChunk IFilter 放在第一個或下一個區塊的開頭,並傳回描述元。
IFilter::GetText 從目前區塊擷取文字。
IFilter::GetValue 從目前區塊擷取值。
IFilter::BindRegion 擷取代表物件指定部分的介面。 保留供未來使用。

隔離過程

Windows 搜尋會在本機系統安全性上下文中執行 IFilters,並以受限制的權限運行。 在此 IFilter 主機隔離程式中,會移除一些許可權:

  • 受限制的程式碼
  • 每個人
  • Local
  • 互動式
  • 已驗證的使用者
  • 內建使用者
  • 使用者的安全性識別碼 (SID)

移除這些許可權表示 IFilter 介面無法存取磁碟系統或網路,或任何使用者介面或剪貼簿函式。 此外,隔離程序會在工作物件下執行,以防止建立子程序,並對工作集施加 100 MB 的限制。 IFilter 介面主機隔離程式會增加索引平臺的穩定性,因為可能無法正確實作第三方篩選。

備註

必須撰寫篩選處理常式來管理緩衝區,並正確堆疊。 所有字串複本都必須有明確的檢查,以防止緩衝區溢出。 您應該一律驗證緩衝區的分配大小。 您應該一律將資料的大小與緩衝區的大小比較。

IFilter dll檔案

Iilter DLL 會實作 IFilter 介面,讓用戶端能夠從檔案類型、類別或感知的類型擷取文字和屬性值資訊。 Windows 搜尋篩選程式 SearchFilterHost.exe 系結至專案類別、感知類型或副檔名註冊的 IFilter

IFilter 結構

每個 IFilter 都是 DLL 檔案,可實作同進程元件物件模型 (COM) 伺服器,以提供指定的篩選功能。 下圖顯示一般 IFilter DLL 的整體結構。 更複雜的範例可能會實作多個 IFilter 類別。

典型 iFilter DLL 的結構圖

原生代碼

篩選必須以原生程式碼撰寫,因為執行多個增益集的進程可能會發生 Common Language Runtime (CLR) 版本設定問題。 在 Windows 7 和更新版本中,會明確封鎖以 Managed 程式碼撰寫的篩選。

尋找 IFilter 類別識別碼

IFilter DLL 的類別會在 PersistentHandler 登錄機碼下註冊。 下列範例適用於 HTML 檔案,說明如何尋找 HTML 檔的 IFilter DLL。 此範例遵循類似於系統用來尋找與專案相關聯的 IFilter 的邏輯。

  1. 檢查 DLL 篩選的檔案類型副檔名是否已在登錄項目 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes 下註冊了 PersistentHandler。 讓這個鍵是 Value1。 如果該項目已存在,請跳至此程序的步驟 4 並在 Value1 該金鑰中使用。 值的類型為 REG_SZ。
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. 或者,如果沒有為延伸模組註冊 PersistentHandler,請在登錄專案 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes下尋找與檔類型相關聯的 CLSID 。 讓這個鍵是 Value2
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. 判斷 CLSID 是否已註冊 PersistentHandler。 使用在步驟 2 中確定的Value2,尋找 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 項目的 PersistentHandler。 讓這個鍵是 Value3
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. 判斷 IFilter 持續性處理常式 GUID。 使用 Value1Value3,尋找檔類型的 IFilter 持續處理常式 GUID。 登錄項目 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 或 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> 底下的值提供此文件類型的 IFilter PersistentHandler GUID。 讓這個鍵是 Value4。 在此範例中, IFilter 介面 GUID 是 89BCB740-6119-101A-BCB7-00DD010655AF。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

備註

在此範例中,HTML 檔的 IFilter DLL 是 nlhtml.dll。

IFilter::GetChunk 和地區設定程式碼識別碼

文字的 LCID 可以在單一檔案內變更。 例如,說明手冊的文字可能會在英文 (en-us) 和西班牙文 (es) 之間交替使用,或者文字可能包含主要語言以外的語言的單一單字。 在任一情況下,每次 LCID 變更時,您的 IFilter 都必須開始新的區塊。 因為 LCID 是用來選擇適當的斷詞工具,所以正確識別它非常重要。 如果 IFilter 無法判斷文字的地區設定,則它應該傳回零的 LCID 與區塊。 傳回零的 LCID 會導致 Windows 搜尋使用語言自動偵測 (LAD) 技術來判斷區塊的地區設定識別碼。 如果 Windows 搜尋找不到相符項目,則會預設為系統預設地區設定(透過呼叫 GetSystemDefaultLocaleName 函數)。 如需詳細資訊,請參閱 IFilter::GetChunkCHUNK_BREAKTYPECHUNKSTATESTAT_CHUNK

如果您控制檔案格式,且目前不包含地區設定資訊,則應新增使用者功能,以啟用適當的地區設定識別。 使用不相符的斷詞工具可能會導致使用者的查詢體驗不佳。 如需詳細資訊,請參閱 IWordBreaker

備註

篩選器與檔案類型相關聯,如副檔名、MIME 類型或 CLSID 所表示。 雖然一個過濾器可以處理多種文件類型,但每種類型只能使用一個過濾器。

其他資源

開發過濾器處理常式

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

從篩選處理常式傳回屬性

隨附於 Windows 的篩選處理常式

在 Windows 搜尋中實作篩選處理常式

註冊篩選處理常式

測試篩選處理程序