オープンソースで実現するファイルサーバ全文検索

はじめに

部門ごとにファイルサーバが増えていくと、「あの資料はどこにあるか」が誰にも分からなくなります。Windows の検索は共有フォルダ単位でしか働かず、サーバが複数あれば横断できません。NAS の全文検索機能も、機器をまたぐと使えません。

この問題を解決する方法のひとつが、ファイルサーバ専用の全文検索サーバを立てることです。本ページでは、オープンソースの全文検索サーバ Fess でファイルサーバを検索対象にする場合に、導入前に確認しておきたい点をまとめます。

対象読者

  • 社内のファイルサーバや NAS の検索に困っている方

  • 全文検索の導入を検討していて、オープンソースで実現できるか知りたい方

  • 既存のアクセス権限を壊さずに検索を導入したい方

Fess は Apache License 2.0 で公開されており、ライセンス費用なしで利用できます。

どこに置かれたファイルを検索できるか

Fess のファイルクロールは、以下のプロトコルに対応しています。設定は管理画面の [クローラー] > [ファイルシステム] で、クロール開始 URL として指定します。

対応プロトコル
プロトコル URL の書式 主な用途
file file:///home/share/documents/ Fess を動かすサーバ上のディレクトリ。マウント済みの NAS もここに含まれます
smb smb://fileserver.example.com/share/ Windows ファイル共有。SMB 2.0.2 から SMB 3.1.1 までに対応します
smb1 smb1://fileserver.example.com/share/ SMB1/CIFS しか話せない古い機器向け
ftp ftp://fileserver.example.com/pub/ FTP サーバ
s3 s3://bucket-name/prefix/ Amazon S3 および S3 互換のオブジェクトストレージ
gcs gcs://bucket-name/prefix/ Google Cloud Storage

有効なプロトコルは設定値 crawler.file.protocols で管理されており、既定値は file,smb,smb1,ftp,s3,gcs です。

Windows ファイル共有を検索する場合、通常は smb を使います。smb1 は SMB1 しか話せない古い NAS やプリントサーバのために残されているもので、SMB1 はセキュリティ上の理由から Windows でも既定で無効化されているため、新規に選ぶものではありません。

既存のアクセス権限をそのまま引き継ぐ

ファイルサーバに検索を導入するとき、いちばん大きな懸念は「見えてはいけない文書が検索結果に出てしまうこと」です。人事や経理の共有フォルダが全社員の検索結果に並んでしまえば、検索システムそのものが使えません。

Fess はこれを、ファイルサーバ側のアクセス権限をそのまま検索に持ち込むという方法で解決します。

仕組み

  1. クロール時に、Fess は各ファイルの ACL(アクセス制御リスト)を読み取ります

  2. 許可・拒否されているアカウントとグループを、その文書の「ロール」として記録します

  3. 検索時に、ログインしているユーザーが持つロールと突き合わせ、権限のある文書だけを返します

許可と拒否の両方が扱われ、内部的には (allow)(deny) のプレフィックスで区別されます。ACL からロールを取り出す動作は既定で有効です。

権限の引き継ぎに関する設定値
設定値 既定値 内容
smb.role.from.file true SMB でクロールしたファイルの ACL からロールを取得します
file.role.from.file true ローカルファイルシステムのパーミッションからロールを取得します
ftp.role.from.file true FTP でクロールしたファイルからロールを取得します
smb.available.sid.types 1,2,4:2,5:1 ロールとして採用する SID の種類。ユーザーとグループの扱いを調整します

導入前に確認すべき前提

この仕組みが最後まで機能するには、検索する側のユーザーにも同じロールが付いている必要があります。文書側には「このグループなら読める」と記録されているので、検索するユーザーが自分の所属グループを Fess に伝えられなければ突き合わせができません。

そのため、権限を引き継いだ検索を行うには Active Directory や LDAP との連携が前提になります。ファイルサーバの認証に使っているディレクトリと同じものを Fess のログインにも使う、という構成です。

逆に、全社員が同じ範囲を見てよい共有フォルダだけを対象にするのであれば、この連携は必須ではありません。導入範囲を決めるときの分かれ目になります。

どのファイル形式の中身まで読めるか

Fess は Apache Tika を利用して、ファイルの中身からテキストを抽出します。ファイル名だけでなく本文が検索対象になるため、「タイトルを思い出せない資料」も見つけられます。

主な対応形式は次のとおりです。

  • MS Office(doc, xls, ppt, docx, xlsx, pptx など)

  • PDF

  • テキスト、HTML、XML

  • リッチテキスト(rtf)

  • ソースコード(js, c, h, java など)

  • 圧縮ファイル(gz, tar, zip など。展開して中身も対象になります)

網羅した一覧は 検索対象ファイル を参照してください。

画像 PDF やスキャン文書のように、そもそもテキストを含まないファイルは、この方法では中身を読めません。OCR が必要になるケースかどうかは、対象フォルダの実態を先に確認しておくことをおすすめします。

構成と規模

Fess は検索インデックスの格納に OpenSearch を使います。小規模であれば Fess と OpenSearch を同じサーバに同居させる構成で動きますが、対象ファイルが増えてきた場合は OpenSearch をクラスター構成にして分離できます。

規模を見積もるときは、ファイル数だけでなく次の点を確認しておくと精度が上がります。

  • 対象フォルダの合計サイズと、そのうちテキストを含むファイルの割合

  • 更新頻度(毎日変わるのか、月に数回か)。クロール間隔の設計に影響します

  • 1 ファイルあたりのサイズ。極端に大きなファイルはクロール対象から外す設定ができます

導入の流れ

  1. まず動かすクイックスタート の手順で Fess を起動します。Docker Compose を使えば数分で検索できる状態になります

  2. クロール設定を作る — 管理画面の [クローラー] > [ファイルシステム] で、対象の URL とクロール間隔を登録します

  3. 認証情報を設定する — 共有フォルダにアクセスするためのアカウントを [クローラー] > [ファイル認証] に登録します

  4. 権限とラベルを設計する — 部門別の絞り込みが必要であればラベルを、権限による出し分けが必要であればロールを設定します

手順を追って構築する例は 第4回 散在するファイルを一元検索 で扱っています。複数のファイルサーバと社内 Web サイトをまとめて 1 つの検索窓から探せるようにするところまでを通しで説明しています。

まとめ

  • Fess はファイルサーバ(SMB/CIFS、FTP、ローカル、S3、GCS)を全文検索の対象にできるオープンソースの検索サーバです

  • SMB でクロールしたファイルは、ACL に記録されたアクセス権限がそのまま検索結果の出し分けに使われます。この動作は既定で有効です

  • 権限を引き継いだ検索を行うには、Active Directory や LDAP との連携が前提になります

  • Apache Tika により、Office 文書や PDF の本文まで検索対象になります

  • 小さく始めて、対象が増えたら OpenSearch をクラスター化して広げられます

参考資料