FessでWEB+DB PRESSのPDF検索システムを構築する

オープンソース全文検索サーバー Fessが強力なので、DockerコンテナでWEB+DB PRESS総集編のPDFを検索できる環境を構築してみました。お手軽な反面、だいぶはまったので設定した内容をメモしてみます。

起動前の準備

LinuxにDocker導入済みなので、基本的な導入手順は公式ページのインストール手順の「設定」の項目以降に沿って行いました。必要なのはLinuxに対するvm.max_map_countの設定と、compose.yamlcompose-opensearch2.yamlの入手です。

Fessのバージョン14.7ではすんなり起動できましたが、後に14.8にバージョンが上がっていたので試してみたらうまくいかず。そのため14.7でしばらく運用するつもりです。

情報
composeコマンド実行する度に2つのyamlファイルを指定するのは面倒なので、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
情報
Fess 14.11.0のコンテナイメージでは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

contentlength.xmlの編集

デフォルトではクロール対象のファイルサイズは10MBまでとなっていました。また、HTML用に2.5MBの定義があるので、これをコピーしてPDF用の定義を作成します。今回は250MBまでのPDFをクロール対象に含めるようにします。

                <postConstruct name="addMaxLength">
                        <arg>"application/pdf"</arg>
                        <arg>262144000</arg><!-- 250M -->
                </postConstruct>
訂正
当初80MBまでで想定していましたが、200MB超えのPDFが含まれていたためクロール対象の設定を250MBまでに変更しました。(2023/5/17)

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のジョブ画面を開き、今すぐ開始ボタンを押せばインデックス作成が始まります。

<<Alpine Linuxのパッケージ管理とシステム更新 HugoのRender Hooksを利用してブロックの表現を拡張する>>