So-net無料ブログ作成
検索選択

netatalkのファイル検索について [Netatalk and Samba]

netatalkボリューム上のファイル検索がおかしい。たまに聞く話です。
これがですね、意外とややこしいのですよ。
検索の速さ
ファイルシステム内を探し回る方法は、とても遅いです。ファイル数が多いほど、ディスクアクセスが遅いほど遅いです。
一方、予め全ファイルを調べて索引を作っておく方法は極めて速いです。
この差はUnix上でfindとlocateを比較すれば歴然です。

Spotlight検索 (現行方式)
Mac OS X 10.4 TigerでSpotlight検索という機能が追加されました。これは予め索引を作っておく方法なので速いです。ファイル名だけでなくファイルの中身の索引も作っているようです。AFPプロトコルの場合、Mac OS X 10.5あたりからFPSpotlightRPCという命令が追加され、これを使えば共有ボリュームでもSpotlight検索ができます。しかしながら、FPSpotlightRPCの詳細は非公開になっています
ところが、既にFPSpotlightRPCリバースエンジニアリングに成功しており、netatalk 3.1にて実装しました

Spotlight検索に対応していないNetatalkの場合は旧式の検索方法が使われます。ファイル名検索はできますが、内容の検索はできません。そして遅いです。

ボリューム全体の検索 (旧式)
Spotlight対応していないAFPでは、ボリューム全体の検索を行なうFPCatSearchExtという命令が使われます。netatalkは古くから実装済みです。
クライアントが検索文字列を送ってくると、サーバは該当するファイルを検索し、ヒットしたファイル名を返します。つまり検索を実施するのはサーバです

特定ディレクトリの検索 (旧式)
Spoitlight対応していない共有ボリューム下の特定のディレクトリ内を検索する場合、上記のFPCatSearchExtは使えません。
この場合、クライアントはFPEnumerateExt2という命令を送ってきます。netatalkは古くから実装済みです。これはディレクトリ下の全ファイルの一覧をよこせという命令です。クライアントは一覧の中から該当ファイルを探します。つまり検索を実施するのはクライアントです

OS Xの検索条件
最近のOS Xの場合、単語単位の前方一致で検索します。(古いMacは試してないのでわかりません。)
たとえば、以下のようなファイル名があったとします。
netatalk.is.fileserver.txt
netatalk is fileserver.txt

キーワード「neta」や「file」で検索した場合、これらのファイルを発見できます。
キーワード「talk」や「server」で検索した場合、netatalkはちゃんと上記ファイルを報告しますが、OS Xはこの結果を無視して表示しません。つまり発見できません。

ファイル名を単語単位に区切って、単語の頭から検索しているわけですね。

大文字/小文字を区別しない検索
netatalkボリューム上のファイル名検索をするとき、
キーワード「abc」で「ABC.txt」が見つかります。
キーワード「abc」で「ABC.txt」が見つかります。
キーワード「αβγ」で「ΑΒΓ.txt」が見つかります。
netatalkは大文字/小文字の変換テーブルを持っているので、バッチリ検索できます。

あいまい検索
OS Xでローカルディスクの検索をするとき、
キーワード「abc」で「abc.txt」を発見できます。
キーワード「アイウエオ」で「アイウエオ.txt」を発見できます。
つまりOS Xは、あいまい検索ができます。これはおそらく、NFKD(正規化形式 互換分解)を使っていると思われます。

netatalkはNFKDを実装してないので問題アリです。
Spotlight対応していないボリューム全体を検索したとき、netatalk自身が検索するのであいまいな検索はできません。特定ディレクトリを検索した場合は、実際に検索するのはMacなのであいまい検索できます。
ややこしいですな。

nice!(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。