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のIndexerは
メタデータとコンテンツデータの両方を扱う
WindowsのIndexerは、Windowsのファイルを扱うことを想定して作られているため、一般的な検索インデクサーとは違い、ファイル内のデータから取り出した「キーワード」と、ファイル名や更新日時、種類といったメタデータ(ファイルの中には記録されていないデータ)を扱う。
メタデータは、エクスプローラーなどが利用する「プロパティ・システム」を使っている。これはエクスプローラーの「カラム」表示のためのもので、更新日時など基本的なカラムに関しては、Windowsに組み込みのプロパティシステムが扱い、アプリケーション独自、ファイル形式独自のプロパティハンドラーを作ることで、独自のデータに対応できる。
Windowsは代表的なファイル形式(画像ファイルなど)のプロパティハンドラーを持っている。たとえば、Exifに対しては、撮影日時などの情報を取り出すことができる。ただし、Exifの全情報を取り出すわけではなく、主要なもののみに限られるなど制限はある。
これに対して、ファイル内からキーワードを取り出すためには、フィルターハンドラー(COMインターフェースの名称からIFilterと呼ばれることもある)を使う。これはファイル形式ごとに必要となる。Windowsはテキストファイル用のフィルターハンドラーを標準で搭載し、Officeには文書ファイル用のフィルターハンドラーがある。フィルターハンドラーは、原則としてアプリケーションが提供する。ただし、中身がテキストになっているファイルであれば、Windowsが持つフィルターハンドラーと拡張子を登録することで、Indexerはキーワードを抽出してインデックス化できる。
拡張子とIFilterの関係
拡張子とIFilterの関係は「コントロールパネル」→「インデックスのオプション」→「詳細設定ボタン」→「詳細オプション」→「ファイルの種類タブ」で見ることができる。
ここには拡張子とフィルターのリストがある。「フィルターの説明」に「ファイルプロパティのフィルター」としか書いていない拡張子は、IFilterのないファイル形式である。ここは、下の「このファイルのインデックスの作成方法」とリンクしていて、「プロパティのみインデックスを作成する」が選択されているとフィルターが「ファイルプロパティのフィルター」になる。
「プロパティとファイルのコンテンツのインデックスを作成する」が選択されているとIFilterの説明が表示される。そのためには、すでにレジストリにIFilterが登録されている必要がある。設定としては、IFilterを持つ拡張子であっても、ファイルコンテンツのインデックスを作成させないこともできる。ここで「プロパティのみのインデックスを作成する」を選ぶ。
現在のExcelのファイルはXMLベースになっているため、中身を解釈することは可能だが、Excelのテンプレートファイル(xltx)は、プロパティのみのインデックスが指定されている。これを中身を含めてインデックス化することは可能なのだが、インデックスのオプションの詳細オプションダイアログは簡易なものであるため、「プロパティとファイルのコンテンツのインデックスを作成する」を選択すると、テキストファイルのIFilter「プレーンテキストフィルター」が指定されてしまう。これを適切なものに変更するには、レジストリの操作が必要だ。
ファイル形式とIFilterは、ファイルの拡張子をベースに組み合わせられる。これは文書ファイルと編集アプリの関係を決める「関連付け」と同じ仕組みで、レジストリの「HKLM¥Software¥Classes」キーを使う(以下HKEY_LOCAL_MACHINEの省略形としてHKLMを使う)。この下に拡張子(ピリオドを含む)を示すキー項目がある。
確実に存在するIFilterで登録の状態を見てみることにしよう。そこで「プレーンテキストフィルター」が必ず指定してある「.txt」を探す。その下に「PersistentHandler」キーがあるはずだ。
その既定値にある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}」が定義されている。
さらにこのGUIDをキーとしてレジストリから探すと
HKLM¥SOFTWARE¥Classes¥CLSID¥{c1243ca0-bf96-11cd-b579-08002b30bfeb}
が見つかる。
その既定値には「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のパスは表示できるが、対応するすべての拡張子を表示してくれるわけではない。
対象も場合によってはGUIDでのみしか表示されないので、レジストリでの検索が必要だ。ちなみにGUIDは、ユニークな値で重複がないため、レジストリの中では常に同じ意味を持つ。単純にレジストリ内をGUIDで検索すれば、IFilterの情報を定義してあるキーが見つかる。同じキーが複数の場所に記録されていることもある。
IFilterは、ファイルのコンテンツをインデックス化するのに必要なのだが、サードパーティアプリの一部は、標準のIFilterを置き換えることがある。Indexerのエラーが多発するような場合、IFilterのエラーを疑う必要がある。IFilterを実行するSearchFilterHost.exeのエラーは、ファイルのエラーもしくは、IFilterのエラーであることが多い。
この連載の記事
-
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 - この連載の一覧へ