FessでWEB+DB PRESSのPDF検索システムを構築する
オープンソース全文検索サーバー Fessが強力なので、DockerコンテナでWEB+DB PRESS総集編のPDFを検索できる環境を構築してみました。お手軽な反面、だいぶはまったので設定した内容をメモしてみます。
起動前の準備
LinuxにDocker導入済みなので、基本的な導入手順は公式ページのインストール手順の「設定」の項目以降に沿って行いました。必要なのはLinuxに対するvm.max_map_count
の設定と、compose.yaml
とcompose-opensearch2.yaml
の入手です。
Fessのバージョン14.7ではすんなり起動できましたが、後に14.8にバージョンが上がっていたので試してみたらうまくいかず。そのため14.7でしばらく運用するつもりです。
compose-opensearch2.yaml
からcompose.override.yaml
にシンボリックリンクを張っておくとファイル名指定が省略できて楽です。設定ファイルの取得
Fessのデフォルト設定では、10MBまでのファイルをインデックス作成対象にしています。
今回、検索対象にするPDFのファイルサイズが大きい(50〜60MB)ため、Fessでインデックスを作成できるように設定する必要があります。設定ファイルの所在が複数のディレクトリに分散しているので、コンテナイメージから変更するファイルを取得して、編集したファイルをマウントして上書きします。
また、サムネイル作成用のシェルスクリプトに不備があったため、ついでに直しておきます。
書き換えが必要な設定ファイルは次のとおりです。
- /etc/fess/fess_config.properties
- /usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml
/usr/share/fess/bin/generate-thumbnail
generate-thumbnail
のシェルスクリプトの不備が修正されていました。修正済みのコンテナイメージを使用する場合は
generate-thumbnail
に関する手順は不要になりますので読み飛ばしてください。(2023/11/11)設定ファイルを置くためのディレクトリを作成しておきます。
mkdir fsetc fscrawler fspatch
コンテナを単純に起動して、必要なファイルを取り出します。
docker run -d -it --rm --name fess ghcr.io/codelibs/fess:14.7.0
docker cp fess:/etc/fess/fess_config.properties ./fsetc/
docker cp fess:/usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml ./fscrawler/
docker cp fess:/usr/share/fess/bin/generate-thumbnail ./fspatch/
docker stop fess
fess_config.propertiesの編集
クローラーが使用するメモリの上限を増やします。今回はホストマシンの搭載メモリがが32GBあるので4GBを最大値として設定しました。
jvm.crawler.options
の-Xmx
を編集します。
-Xmx4096m
適切な値が設定されていない場合、クローラーのジョブログの結果に以下のようなエラーが記録されます。
Exit Code: 1
Output:
Error occurred during initialization of VM
Initial heap size set to a larger value than the maximum heap size
contentlength.xmlの編集
デフォルトではクロール対象のファイルサイズは10MBまでとなっていました。また、HTML用に2.5MBの定義があるので、これをコピーしてPDF用の定義を作成します。今回は400MBまでのPDFをクロール対象に含めるようにします。
<postConstruct name="addMaxLength">
<arg>"application/pdf"</arg>
<arg>419430400</arg><!-- 400M -->
</postConstruct>
generate-thumbnailの編集
このファイルは設定ファイルではありません。検索結果に表示されるサムネイルを作成するスクリプトなのですが、内部で使用しているコマンドが生成するファイル名とスクリプトが想定しているファイル名が一致せず処理が失敗してしまいます。
問題の特定と解決をされていたfessでthumbnail画像が生成されない問題というページがありましたので、こちらを参照させていただき該当箇所を修正してサムネイルが作られるようにします。
pdftoppm
コマンドのオプションに-l 1
を指定している箇所を-singlefile
に変更します。
pdftoppm -png -singlefile "${target_file}" ${tmp_png_prefix}
compose.ymlの編集
変更を加えたファイルをコンテナにマウントするための定義を追加します。
volumes:
- ./fsetc/fess_config.properties:/etc/fess/fess_config.properties
- ./fscrawler/contentlength.xml:/usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml
- ./fspatch/generate-thumbnail:/usr/share/fess/bin/generate-thumbnail
- /srv/docs/webdbpress/:/srv/docs/webdbpress:ro
検索対象にしたいWEB+DB PRESSのDVDの内容は/srv/docs/webdbpress
に格納しておいて、コンテナ内の同パスに読み取り専用でマウントすることにします。
Fess起動とクロール設定
下準備を済ませているので、以下のコマンドで起動できます。
docker compose up -d
起動には少し時間がかかります。
起動後は管理者パスワードを設定し、管理画面のメニューからクローラー
→ファイルシステム
を選択します。
新規作成
からファイルクロールの設定を開いて、最低限必要な項目を設定します。
項目名 | 値 |
---|---|
名前 | webdbpress |
パス | file:/srv/docs/webdbpress/webdb_pdf |
クロール設定後、管理画面上部のクローラー実行
からDefault Crawler
のジョブ画面を開き、今すぐ開始
ボタンを押せばインデックス作成が始まります。