了解 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。 使用 Value1 和 Value3,尋找檔類型的 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::GetChunk、 CHUNK_BREAKTYPE、 CHUNKSTATE 和 STAT_CHUNK。

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

備註

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

其他資源

開發過濾器處理常式

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

從篩選處理常式傳回屬性

隨附於 Windows 的篩選處理常式

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

註冊篩選處理常式

測試篩選處理程序