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

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

  • ASCII.jp
  • 更新日:2020/11/22

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/

No image

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

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

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

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

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

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

拡張子とIFilterの関係

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

No image
No image

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

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

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

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

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

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

No image

レジストリエディタで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}」が定義されている。

No image

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

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

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

が見つかる。

No image
No image

{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のパスは表示できるが、対応するすべての拡張子を表示してくれるわけではない。

No image

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

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

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

塩田紳二 編集● ASCII

この記事をお届けした
グノシーの最新ニュース情報を、

でも最新ニュース情報をお届けしています。

外部リンク

  • このエントリーをはてなブックマークに追加