FSCrawlerとは
FSCrawlerは、指定されたディレクトリ配下のファイルシステムをスキャンし、Elasticsearchにそのデータをインデックスするためのオープンソースのソフトウェアです。このツールはElastic社が管理しているものではありませんが、メンテナーはElasticの社員です(記事執筆時点では)。
FSCrawlerはドキュメントの内容を解析し、検索可能な形式で保存することができます。多くのファイル形式(PDF、Word、Excel、テキストファイルなど)をサポートしており、メタデータも抽出します。このデータ抽出については、Apache Tikaを使用しています。
このツールが対象とする処理は、基本的にファイルシステムにあるファイルをそのままElasticsearchに送り込むことで、極めてシンプルかつよくありそうなユースケースですが、意外と同等のことができるツールが見当たりませんでした。考えられる候補は以下でしょうか。
-
Logstash: file inputプラグインは基本的にログファイルの追跡を目的としており、(設定の余地はありあますが)基本的に1行を1イベントとして扱います。Logstashを使おうとする場合、exec inputプラグインでfindコマンドなどを実行し、ファイルの一覧を取得してから、そのファイルをRubyで1つずつ読み込むような形になるでしょう。その後のデータ抽出なども自前で実装する必要があり、手間がかかります。
-
Connectors: 公式のElasticsearchコネクタは、主にデータベースやクラウドストレージからのデータ取り込みを対象にしています。近いものとしてNetwork Drive ConnectorはSambaの共有ドライブからのデータ抽出をサポートしていますが、ローカルファイルシステムからの直接取り込みには対応していません。実験的な実装のDirectory Connectorもコードベース上にはありますが、公式にはリリースされていません。
-
Elastic Open Web Crawler: 主にウェブコンテンツのクロールとインデックス作成を目的としており、ローカルファイルシステムからのデータ取り込みには対応していません。
-
Filebeat: 主にログファイルの収集と転送を目的としており、一般的なファイルシステムからのデータ取り込みは想定されていません。
ということで、特定のディレクトリ以下にあるファイルをElasticsearchにインデックスするという極めて一般的と思われるユースケースですが、意外と代替となるツールが見当たらないため、FSCrawlerはこのニーズに応えるための有用なツールとなっています。(みなさん同様のケースはどうされているんですかね? 都度スクリプトを書かれているのでしょうか?)
FSCrawlerのインストール
FSCrawlerはJavaベースのツールであり、最新版のzipアーカイブをダウンロードして展開するだけで利用可能です。Java 11以降が必要です。
ただ、ちょっとダウンロードリンクが極めてわかりずらい上に、記事執筆時点では公式サイトにあるリンクは壊れていました。
どうもMavenのホスティングサイトに問題があるようで、公式サイトのリンクが壊れている場合は、maven-metadata.xmlファイルを確認して自分でURLを組み立てる必要があります。
snapshotVersionのvalueの値(以下の例では2.10-20250801.161301-75)を特定してから、以下のようなURLから直接ダウンロードする必要があります。
FSCrawlerの基本的な使い方
FSCrawlerの基本的な使い方は公式サイトのGetting Startedに詳しく記載されていますので、基本はそちらを参照して下さい。
FSCrawlerはJavaベースのツールであるため、前提としてJavaがインストールされ、JAVA_HOME環境変数が設定されている必要があります。その上で、上記Zipアーカイブを展開したディレクトリで以下のコマンドを実行すると、必要な設定ファイルが作成されます。
bin/fscrawler --setup
このコマンドを実行すると、~/.fscrawler/{job_name}/_settings.yamlという設定ファイルが作成されます。{job_name}はデフォルトではfscrawlerとなっています。--setup job_nameのようにジョブ名を指定することも可能です。
_settings.yaml
_settings.yamlファイルはFSCrawlerの動作を制御するための設定ファイルです。以下のような内容を記載します。
name: "job_name"
fs:
url: "/path/to/your/directory"
includes:
- "**/*.html"
- "**/*.md"
- "**/*.pdf"
ocr:
enabled: false
update_rate: "15m"
raw_metadata: true
elasticsearch:
urls:
- "http://localhost:9200"
api_key: "YOUR_API_KEY"
index: "index_for_files"
index_folder: "index_for_folders"
pipeline: "pipeline_name"
この例では、/path/to/your/directory以下のHTML、Markdown、PDFファイルを対象にスキャンし、15分ごとに更新をチェックするように設定しています。Elasticsearchへの接続情報やインデックス名も指定しています。
設定ファイルの詳細については公式ドキュメントを参照してください。
以下、いくつかの設定について補足します。
メタデータ抽出
FSCrawlerはApache Tikaを使用してファイルの内容を解析します。Apache Tikaは、さまざまなファイル形式からテキストやメタデータを抽出するためのJava製のライブラリです。Tikaは画像やPDFなどのメタデータも抽出可能で、raw_metadata: trueを設定することで、これらのTikaが抽出したメタデータも全てElasticsearchにインデックスさせることができます。
OCRの有効化
FSCrawlerはTesseractを利用することでOCR(Optical Character Recognition)機能もサポートしており、画像内のテキストを抽出することも可能です。OCRを有効にするには、ocr.enabledをtrueに設定します。ただしこのときはTesseractがシステムにインストールされている必要があります。今回OCRは使用しないため、falseのままとしています。
FSCrawlerの実行
設定ファイルが準備できたら、以下のコマンドでFSCrawlerを実行します。
bin/fscrawler job_name
job_nameは設定ファイルで指定したジョブ名です。問題なく動作すれば、指定したディレクトリ以下のファイルが設定ファイルで指定したElasticsearchのインデックスに登録されます。
_status.yaml
FSCrawlerは実行中の状態を~/.fscrawler/{job_name}/_status.yamlファイルに保存します。このファイルには、最後にスキャンした日時やインデックスされたドキュメント数などの情報が含まれています。これにより、次回の実行時に前回の状態を基に差分のみを処理することが可能となります。
テストなどで状態をリセットしたい場合は、--restartオプションを付けて実行することで全てのファイルをスキャンし直すことができます。
bin/fscrawler --restart job_name
あるいは、この_status.yamlファイルを単に削除すれば同様の効果が得られます。
まとめ
FSCrawlerは、ローカルファイルシステムからElasticsearchにデータをインデックスするための強力で柔軟なツールです。設定も比較的簡単な上にApache Tikaを利用したメタデータ抽出やOCR機能もサポートしています。サーバー上に保存されている静的コンテンツをElasticsearchに取り込みたい場合には、有力な選択肢になるのではないでしょうか。