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

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

本主題的組織方式如下:

關於 IFilter 介面

Microsoft Windows 搜尋會使用篩選來擷取專案的內容,以包含在全文檢索索引中。 您可以藉由撰寫篩選來擷取內容,以及屬性處理常式來擷取檔案的屬性,以擴充 Windows 搜尋以編制新或專屬檔案類型的索引。

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

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

函式 描述
LoadIFilter 取得最適合指定內容類型之 IFilter 的指標。
BindIFilterFromStorage 取得 IFilter 的指標,最適合 IStorage Interface 物件中包含的內容。
BindIFilterFromStream 取得 IFilter 的指標,最適合從資料流程變數擷取的指定類別識別碼 (CLS) ID。

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

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

隔離程式

Windows 搜尋會在具有限制許可權的本機系統安全性內容中執行 IFilters。 在此 IFilter 主機隔離程式中,會移除一些許可權:

  • 受限制的程式碼
  • 所有人
  • 本機
  • 互動式
  • 驗證的使用者
  • 內建使用者
  • 使用者的安全性識別碼 (SID)

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

注意

篩選處理常式必須寫入以管理緩衝區,並正確堆疊。 所有字串複本都必須有明確的檢查,才能防範緩衝區溢位。 您應該一律確認緩衝區的配置大小。 您應該一律根據緩衝區的大小來測試資料的大小。

IFilter DLL

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

IFilter 結構

每個 IFilter 都是一個 DLL 檔案,可實作處理中的元件物件模型 (COM) 伺服器,以提供指定的篩選功能。 下圖說明一般 IFilter DLL 的整體結構。 更複雜的範例可以實作一個以上的 IFilter 類別。

典型 ifilter dll 結構的圖表

機器碼

篩選必須以原生程式碼撰寫,因為可能會有通用語言執行平臺 (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。 使用 Value2 在步驟 2 中決定的 ,尋找 \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) 與西班牙文 (之間替代,) ,或者文字可能會以主要語言以外的語言包含單字。 不論是哪一種情況, IFilter 都必須在每次 LCID 變更時開始新的區塊。 因為 LCID 是用來選擇適當的斷詞工具,所以請務必正確地識別它。 如果 IFilter 無法判斷文字的地區設定,它應該會傳回具有區塊的 LCID 為零。 傳回零的 LCID 會導致 Windows 搜尋使用語言自動偵測 (LAD) 技術來判斷區塊的地區設定識別碼。 如果 Windows 搜尋找不到相符專案,它會呼叫 GetSystemDefaultLocaleName 函 式) ,預設為系統預設地區設定 (。 如需詳細資訊,請參閱 IFilter::GetChunkCHUNK_BREAKTYPECHUNKSTATESTAT_CHUNK

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

注意

篩選準則會與檔案類型相關聯,如副檔名、MIME 類型或 CLSID 所表示。 雖然一個篩選可以處理多個檔案類型,但每個類型只能搭配一個篩選準則使用。

其他資源

開發篩選處理常式

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

從篩選處理常式傳回屬性

隨附于 Windows 的篩選處理常式

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

註冊篩選處理常式

測試篩選處理常式