瞭解 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 類別。
機器碼
篩選必須以原生程式碼撰寫,因為可能會有通用語言執行平臺 (CLR) 執行多個增益集的程式版本控制問題。 在 Windows 7 和更新版本中,明確封鎖以 Managed 程式碼撰寫的篩選。
尋找 IFilter 類別識別碼
IFilter DLL 的類別會在 PersistentHandler 登錄機碼下註冊。 下列 HTML 檔案範例說明如何尋找 HTML 檔案的 IFilter DLL。 此範例遵循類似于系統用來尋找與專案相關聯的 IFilter 的邏輯。
- 檢查 DLL 篩選器在登錄專案 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes下註冊 PersistentHandler 的檔案類型副檔名。 讓此機碼成為
Value1
。 如果該專案已經存在,請跳至此程式的步驟 4,並在該索引鍵中使用Value1
。 這些值的類型為 REG_SZ。
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 或者,如果沒有為延伸模組註冊 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}
- 判斷是否已為 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}
- 判斷 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) 與西班牙文 (之間替代,) ,或者文字可能會以主要語言以外的語言包含單字。 不論是哪一種情況, IFilter 都必須在每次 LCID 變更時開始新的區塊。 因為 LCID 是用來選擇適當的斷詞工具,所以請務必正確地識別它。 如果 IFilter 無法判斷文字的地區設定,它應該會傳回具有區塊的 LCID 為零。 傳回零的 LCID 會導致 Windows 搜尋使用語言自動偵測 (LAD) 技術來判斷區塊的地區設定識別碼。 如果 Windows 搜尋找不到相符專案,它會呼叫 GetSystemDefaultLocaleName 函 式) ,預設為系統預設地區設定 (。 如需詳細資訊,請參閱 IFilter::GetChunk、 CHUNK_BREAKTYPE、 CHUNKSTATE和 STAT_CHUNK。
如果您控制檔案格式,而且目前不包含地區設定資訊,您應該新增使用者功能來啟用適當的地區設定識別。 使用不相符的斷詞工具可能會導致使用者的查詢體驗不佳。 如需詳細資訊,請參閱 IWordBreaker。
注意
篩選準則會與檔案類型相關聯,如副檔名、MIME 類型或 CLSID 所表示。 雖然一個篩選可以處理多個檔案類型,但每個類型只能搭配一個篩選準則使用。
其他資源
- GitHub上提供的IFilterSample程式碼範例示範如何建立 IFilter 基類來實作IFilter介面。
- 如需編制索引程式的概觀,請參閱 編制索引進程。
- 如需檔案類型的概觀,請參閱 檔案類型。
- 若要查詢檔案類型的檔案關聯屬性,請參閱 PerceivedTypes、SystemFileAssociations 和應用程式註冊。