このページの本文へ

Windows Info 第251回

WindowsサーチのIndexerで使われるIFilterを調べる

2020年11月22日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 Windowsサーチには、検索処理を高速化するIndex Serviceがある。これは、ファイルの属性やファイルの中に含まれるキーワードなどをインデックス化するものだ。このIndex Seviceは、Indexer、もしくは最初の製品から「Index Server」などと呼ばれることもある。Windowsサーチについてはこれまで何回か解説したので、以下の記事も合わせて参照していただきたい。

●進化しているWindowsサーチ、そしてインデックス作成が重いときの対処法
 https://ascii.jp/elem/000/004/024/4024057/
●Windows標準のサーチ機能を活用する
 https://ascii.jp/elem/000/000/942/942736/
●Windowsの検索機能で用いられるサーチインデックスを制御する
 https://ascii.jp/elem/000/000/938/938533/

Windows SearchのエラーはIndexerで起きやすい。場合によっては、これによりインデックス作成を繰り返すことがある

WindowsのIndexerは
メタデータとコンテンツデータの両方を扱う

 WindowsのIndexerは、Windowsのファイルを扱うことを想定して作られているため、一般的な検索インデクサーとは違い、ファイル内のデータから取り出した「キーワード」と、ファイル名や更新日時、種類といったメタデータ(ファイルの中には記録されていないデータ)を扱う。

 メタデータは、エクスプローラーなどが利用する「プロパティ・システム」を使っている。これはエクスプローラーの「カラム」表示のためのもので、更新日時など基本的なカラムに関しては、Windowsに組み込みのプロパティシステムが扱い、アプリケーション独自、ファイル形式独自のプロパティハンドラーを作ることで、独自のデータに対応できる。

 Windowsは代表的なファイル形式(画像ファイルなど)のプロパティハンドラーを持っている。たとえば、Exifに対しては、撮影日時などの情報を取り出すことができる。ただし、Exifの全情報を取り出すわけではなく、主要なもののみに限られるなど制限はある。

 これに対して、ファイル内からキーワードを取り出すためには、フィルターハンドラー(COMインターフェースの名称からIFilterと呼ばれることもある)を使う。これはファイル形式ごとに必要となる。Windowsはテキストファイル用のフィルターハンドラーを標準で搭載し、Officeには文書ファイル用のフィルターハンドラーがある。フィルターハンドラーは、原則としてアプリケーションが提供する。ただし、中身がテキストになっているファイルであれば、Windowsが持つフィルターハンドラーと拡張子を登録することで、Indexerはキーワードを抽出してインデックス化できる。

拡張子とIFilterの関係

 拡張子とIFilterの関係は「コントロールパネル」→「インデックスのオプション」→「詳細設定ボタン」→「詳細オプション」→「ファイルの種類タブ」で見ることができる。

IFilterと拡張子の対応を見るには、「コンロールパネル」→「インデックスのオプション」→「詳細設定ボタン」を押して詳細オプションダイアログボックスを開き、ファイルの種類タブを使う

 ここには拡張子とフィルターのリストがある。「フィルターの説明」に「ファイルプロパティのフィルター」としか書いていない拡張子は、IFilterのないファイル形式である。ここは、下の「このファイルのインデックスの作成方法」とリンクしていて、「プロパティのみインデックスを作成する」が選択されているとフィルターが「ファイルプロパティのフィルター」になる。

 「プロパティとファイルのコンテンツのインデックスを作成する」が選択されているとIFilterの説明が表示される。そのためには、すでにレジストリにIFilterが登録されている必要がある。設定としては、IFilterを持つ拡張子であっても、ファイルコンテンツのインデックスを作成させないこともできる。ここで「プロパティのみのインデックスを作成する」を選ぶ。

 現在のExcelのファイルはXMLベースになっているため、中身を解釈することは可能だが、Excelのテンプレートファイル(xltx)は、プロパティのみのインデックスが指定されている。これを中身を含めてインデックス化することは可能なのだが、インデックスのオプションの詳細オプションダイアログは簡易なものであるため、「プロパティとファイルのコンテンツのインデックスを作成する」を選択すると、テキストファイルのIFilter「プレーンテキストフィルター」が指定されてしまう。これを適切なものに変更するには、レジストリの操作が必要だ。

 ファイル形式とIFilterは、ファイルの拡張子をベースに組み合わせられる。これは文書ファイルと編集アプリの関係を決める「関連付け」と同じ仕組みで、レジストリの「HKLM¥Software¥Classes」キーを使う(以下HKEY_LOCAL_MACHINEの省略形としてHKLMを使う)。この下に拡張子(ピリオドを含む)を示すキー項目がある。

 確実に存在するIFilterで登録の状態を見てみることにしよう。そこで「プレーンテキストフィルター」が必ず指定してある「.txt」を探す。その下に「PersistentHandler」キーがあるはずだ。

レジストリエディタでHKLM¥Software¥Classesを開き、その下からIFilterを探したい拡張子を探す。「.txt」には、「PersistentHandler」キーがあり、そこにGUID{5e941d80-bf96-11cd-b579-08002b30bfeb}が定義されていた

 その既定値にあるGUIDをキーとしてさらにレジストリから検索します。筆者の環境では、ここに「{5e941d80-bf96-11cd-b579-08002b30bfeb}」が定義されていた。

HKLM¥SOFTWARE¥Classes¥CLSID¥{5e941d80-bf96-11cd-b579-08002b30bfeb}

というキーには、「PersistentAddinsRegistered」キーの下に「{89BCB740-6119-101A-BCB7-00DD010655AF}」というキーがある。このキーは、IFilterを示すGUIDである。その既定値には、「{c1243ca0-bf96-11cd-b579-08002b30bfeb}」が定義されている。

{5e941d80-bf96-11cd-b579-08002b30bfeb}キーには、「PersistentAddinsRegistered」サブキーがあり、そこには、GUID {c1243ca0-bf96-11cd-b579-08002b30bfeb}が記録されている

 さらにこのGUIDをキーとしてレジストリから探すと

HKLM¥SOFTWARE¥Classes¥CLSID¥{c1243ca0-bf96-11cd-b579-08002b30bfeb}

が見つかる。

{c1243ca0-bf96-11cd-b579-08002b30bfeb}キーを見ると既定値に「Plain Text filter」と記述があり、InprocServer32サブキーにIFilterとなるDLLへのパス“%systemroot%¥system32¥query.dll”かある。このquery.dllがテキストファイルのIFilterである

 その既定値には「Plain Text Filter」と書いてある。前述のダイアログに表示される日本語の「プレーンテキストフィルター」を得たいなら、query.dllから文字列リソースを取り出す必要があるのだが、面倒(プログラムを書く必要がある)なのでここまでとする。

 このように拡張子のキーからPersistentHandlerにあるGUIDを追っていけばいいのだが、IFilterの登録方法にはもう1つあって、CLSID(COMのクラスID)を使う方法だ。こちらは、拡張子の下に「CLSID」というキーがあるので、そのキーを追っていく。同様にIFilterを表す「{89BCB740-6119-101A-BCB7-00DD010655AF}」が出てくるので、その既定値を探す。

 これを簡単にするためには、以下の3つのキーを探せばいい。

{89BCB740-6119-101A-BCB7-00DD010655AF}
PersistentHandler
PersistentAddinsRegistered

Windows SDKがインストールしてあれば
IFilter開発用ツールが利用できる

 なお、Windows SDKがインストールしてあるなら、IFilter開発用のサポートツールが利用できる。そのうちの1つ「Filtreg.exe」を使うことで登録されているIFilterを出力できる。ただし、このツールではIFilterのパスは表示できるが、対応するすべての拡張子を表示してくれるわけではない。

Windows SDKに含まれるFiltreg.exeを使うと、登録されているIFilterを列挙できるが、拡張子はすべては表示されない

 対象も場合によってはGUIDでのみしか表示されないので、レジストリでの検索が必要だ。ちなみにGUIDは、ユニークな値で重複がないため、レジストリの中では常に同じ意味を持つ。単純にレジストリ内をGUIDで検索すれば、IFilterの情報を定義してあるキーが見つかる。同じキーが複数の場所に記録されていることもある。

 IFilterは、ファイルのコンテンツをインデックス化するのに必要なのだが、サードパーティアプリの一部は、標準のIFilterを置き換えることがある。Indexerのエラーが多発するような場合、IFilterのエラーを疑う必要がある。IFilterを実行するSearchFilterHost.exeのエラーは、ファイルのエラーもしくは、IFilterのエラーであることが多い。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン