Windows Search のフィルター ハンドラーについて
IFilter インターフェイスの実装であるフィルター ハンドラーは、ドキュメントでテキストとプロパティをスキャンします。 フィルター ハンドラーは、これらの項目からテキストのチャンクを抽出し、埋め込み書式をフィルター処理し、テキストの位置に関する情報を保持します。 また、ドキュメント プロパティである値のチャンクも抽出します。 IFilter は、ドキュメント インデクサーやアプリケーションに依存しないビューアーなど、より高度なアプリケーションを構築するための基盤です。
このトピックは次のように整理されています。
IFilter インターフェイスについて
Microsoft Windows Search では、フィルターを使用して、フルテキスト インデックスに含めるアイテムの内容を抽出します。 コンテンツを抽出するフィルターと、ファイルのプロパティを抽出するプロパティ ハンドラーを記述することで、Windows Search を拡張して新しいファイルの種類または独自のファイルの種類のインデックスを作成できます。
IFilter インターフェイスは、フルテキスト検索エンジンの特定のニーズを満たすように設計されています。 Windows Search などのフルテキスト検索エンジンは 、IFilter メソッドを呼び出してテキストとプロパティの情報を抽出し、インデックスに追加します。 Windows Search は、返された IFilter::GetText メソッドの結果を単語に分割し、正規化してインデックスに保存します。 使用可能な場合、検索エンジンはテキスト チャンクの言語コード識別子 (LCID) を使用して、言語固有の単語区切りと正規化を実行します。
Windows Search では、次の表で説明する 3 つの関数を使用して、登録済みのフィルター ハンドラー ( IFilter インターフェイスの実装) にアクセスします。 これらの関数は、埋め込みオブジェクトのフィルター ハンドラーを読み込んでバインドする場合に特に便利です。
機能 | 説明 |
---|---|
LoadIFilter | 指定したコンテンツ タイプに最も適した IFilter へのポインターを取得します。 |
BindIFilterFromStorage | IStorage Interface オブジェクトに含まれるコンテンツに最も適した IFilter へのポインターを取得します。 |
BindIFilterFromStream | ストリーム変数から取得した、指定したクラス識別子 (CLSID) に最も適した IFilter へのポインターを取得します。 |
IFilter インターフェイスには、次の表で説明する 5 つのメソッドがあります。
メソッド | 説明 |
---|---|
IFilter::Init | フィルター処理セッションを初期化します。 |
IFilter::GetChunk | 最初または次のチャンクの先頭に IFilter を配置し、記述子を返します。 |
IFilter::GetText | 現在のチャンクからテキストを取得します。 |
IFilter::GetValue | 現在のチャンクから値を取得します。 |
IFilter::BindRegion | オブジェクトの指定した部分を表すインターフェイスを取得します。 将来利用するために予約されています。 |
分離プロセス
Windows Search は、制限付き権限を持つローカル システム セキュリティ コンテキストで IFilters を実行します。 この IFilter ホスト分離プロセスでは、いくつかの権限が削除されます。
- Restricted Code
- Everyone
- ローカル
- Interactive
- Authenticated Users
- 組み込みユーザー
- ユーザーのセキュリティ識別子 (SID)
これらの権限の削除は、 IFilter インターフェイスがディスク システムまたはネットワーク、またはユーザー インターフェイスまたはクリップボード関数にアクセスしないことを意味します。 さらに、分離プロセスは、子プロセスの作成を妨げ、ワーキング セットに 100 MB の制限を課すジョブ オブジェクトの下で実行されます。 IFilter インターフェイス ホスト分離プロセスは、誤って実装されたサード パーティ製フィルターの可能性により、インデックス作成プラットフォームの安定性を向上させます。
Note
フィルター ハンドラーは、バッファーを管理し、正しくスタックするように記述する必要があります。 すべての文字列コピーには、バッファー オーバーランを防ぐために明示的なチェックが必要です。 バッファーの割り当てられたサイズは常に確認する必要があります。 常に、バッファーのサイズに対してデータのサイズをテストする必要があります。
IFilter DLL
Ifilter DLL は IFilter インターフェイスを実装し、クライアントがファイルの種類、クラス、または認識型からテキストとプロパティ値の情報を抽出できるようにします。 Windows Search フィルター処理プロセス SearchFilterHost.exe 、項目のクラス、認識型、または名前拡張に登録されている IFilter にバインドされます。
IFilter 構造体
各 IFilter は、指定されたフィルター処理機能を提供するインプロセス コンポーネント オブジェクト モデル (COM) サーバーを実装する DLL ファイルです。 次の図は、一般的な IFilter DLL の全体的な構造を示しています。 より複雑な例では、複数の IFilter クラスを 実装できます。
ネイティブ コード
複数のアドインが実行されるプロセスで共通言語ランタイム (CLR) のバージョン管理の問題が発生する可能性があるため、ネイティブ コードでフィルターを記述する必要があります。 Windows 7 以降では、マネージド コードで記述されたフィルターは明示的にブロックされます。
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}
- PersistentHandler が CLSID に登録されているかどうかを確認します。 手順 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}
-
IFilter 永続ハンドラー GUID を決定します。 と を
Value3
使用してValue1
、ドキュメントの種類の 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}
Note
この例では、HTML ドキュメント用 の IFilter DLL がnlhtml.dllされています。
IFilter::GetChunk とロケール コード識別子
テキストの LCID は、1 つのファイル内で変更できます。 たとえば、取扱説明書のテキストが英語 (en-us) とスペイン語 (es) の間で交互に表示される場合や、テキストに第 1 言語以外の言語の 1 つの単語が含まれている場合があります。 どちらの場合も、LCID が変更されるたびに IFilter が新しいチャンクを開始する必要があります。 LCID は適切なワード ブレーカーを選択するために使用されるため、正しく識別することが非常に重要です。 IFilter がテキストのロケールを判別できない場合は、チャンクを含む 0 の LCID を返す必要があります。 LCID を 0 に設定すると、Windows Search で言語自動検出 (LAD) テクノロジを使用してチャンクのロケール ID が決定されます。 Windows Search で一致するものが見つからない場合は、既定でシステムの既定のロケールになります ( GetSystemDefaultLocaleName 関数関数 を呼び出します)。 詳細については、「 IFilter::GetChunk、 CHUNK_BREAKTYPE、 CHUNKSTATE、 およびSTAT_CHUNK」を参照してください。
ファイル形式を制御していて、現在ロケール情報が含まれていない場合は、適切なロケール識別を有効にするユーザー機能を追加する必要があります。 ワード ブレーカーの不一致を使用すると、ユーザーのクエリ エクスペリエンスが低下する可能性があります。 詳細については、「 IWordBreaker」を参照してください。
Note
フィルターは、ファイル名拡張子、MIME の種類、または CLSID で示されるファイルの種類に関連付けられます。 1 つのフィルターで複数のファイルの種類を処理できますが、各種類は 1 つのフィルターでのみ機能します。
その他のリソース
- GitHub で入手できる IFilterSample コード サンプルは、IFilter インターフェイスを実装するための IFilter 基本クラスを作成する方法を示しています。
- インデックス作成プロセスの概要については、「 インデックス作成プロセス」を参照してください。
- ファイルの種類の概要については、「ファイルの 種類」を参照してください。
- ファイルの種類のファイル関連付け属性を照会するには、「 PerceivedTypes、SystemFileAssociations、およびアプリケーション登録」を参照してください。
関連トピック
Windows Search でフィルター ハンドラーを作成するためのベスト プラクティス