FessのDocSearchテーマで日本語入力とDocker更新時の動作を改善する

DocSearchテーマで、日本語入力、キーボード操作、小さい画面の表示を改善しました。あわせてdocker-docsearchのテーマ同期処理も修正し、稼働中のコンテナーでテーマを更新した際に検索画面が404になる問題を解消しています。

変換確定のEnterで検索しない

コマンドパレットや検索候補の操作では、IME変換中のEnter、矢印、Escapeを検索画面のコマンドとして処理しないようにしました。日本語の変換確定で意図せず検索が実行されるのを防ぐ変更です。実機のIMEによる測定はPRでは行っておらず、合成したcompositionイベントによるテストが中心です。

閉じた検索オプションや旧検索フォームがTab移動の対象から外れ、オプションを開くとフォーカスが中へ移ります。Escapeや外側のクリックで閉じ、開いた操作元へ戻せます。ホーム画面の検索候補も上下矢印、Enter、Escapeで操作できるようになりました。

小さい画面と共有URL

幅768px未満ではヘッダーのナビゲーションをメニューボタンから開けるようにし、Helpやテーマ切り替えなどへアクセスできます。長い検索語の折り返し、ダークモードのロゴ、ラベル名の表示も改善しています。「類似した結果」の状態はsdhとしてURLへ反映され、再読み込みや共有で同じ表示を再現できるようになります。

変更はdocsearchテーマに限定され、他のテーマへ一律に適用されるものではありません。テーマのバージョンは15.9.9、theme.ymlのminFessVersionは15.9です。確認時点のFess最新正式リリースは15.8.0なので、15.9.9というテーマ番号をFess 15.9の正式リリースと混同しないでください。

Dockerでテーマを更新する

docker-docsearchのsetup.shは、ホスト側のテーマディレクトリーを削除して作り直す方式から、中身だけを置き換える方式へ変わりました。bind mountを維持できるため、稼働中のfess01からテーマが消えなくなります。取得や検証に失敗した場合は、既存テーマを置き換えません。

git pull
bash ./bin/setup.sh
docker compose -f compose.yaml restart fess01

HTMLやassetsは次のリクエストから反映できますが、theme.ymlのバージョンなどは起動時に読むため、テーマ更新後はfess01を再起動します。docker compose up -dだけでは、テーマのみの更新を検知してコンテナーを作り直すとは限りません。ブラウザーではアセットが最大1日キャッシュされるので、確認時は強制再読み込みも行います。

初期値と更新時の注意点

テーマ取得元FESS_THEMES_REPOの初期値はhttps://github.com/codelibs/fess-themes.git、FESS_THEMES_REFはmainです。FESS_THEMES_DIRは未設定が初期値で、ローカルのチェックアウトを指定した場合はそのthemes/docsearchを使い、REFは無視されます。mainを使うと開発中のテーマを取得するため、対応するFessとの組み合わせを確認してください。

setup.shはテーマ内のローカル変更を置き換えます。独自編集は事前に保管してください。一方、既存のdata/fess/opt/fess/system.propertiesは上書きしません。Composeの標準構成はまだFess 15.8.0とOpenSearch 3.8.0で、今回の15.9向けテーマを標準構成のまま動作保証する変更ではありません。

15.9移行時はGroovy継続かJavaScript移行を選びます。Groovyを継続する場合は対応するプラグインを起動前に配置し、JavaScriptへ移す場合は起動後すぐ管理画面で既存ジョブを変更します。起動ログの未登録エンジン警告はジョブ以外の設定も確認する手がかりになります。今回の記事は、マージ済みの開発変更と更新時の注意点をまとめたものです。

関連PR

fessctlで一覧のページングと移行対象の取り漏れを確認する

fessctlの一覧取得で、指定したページや件数がFess側に反映されない問題が修正されました。登録件数が多い環境の移行スクリプトでは、同じ先頭ページを繰り返して残りの設定を取り漏らしていたため、ページごとのID確認が重要です。

一覧取得の指定が反映される

Fess 15.8と15.9の管理一覧APIは、GETリクエストのJSON本文から size と page を読みます。従来のfessctlはURLパラメーターだけを送り、サーバーの標準25件が返っていました。修正後はJSON本文にも送り、CLIの既存初期値 --size 100 が実際に適用されます。IDで1件を取得するGETは変更されません。

修正を含むfessctlで、次の2ページのIDが異なることと total を確認します。接続先と管理用アクセストークンは通常のfessctl設定を利用します。

fessctl scheduler list --size 1 --page 1 -o json
fessctl scheduler list --size 1 --page 2 -o json

23種類の一覧取得が共通の修正対象です。Fess 14.xでは今回のPRで動作確認されていません。中間プロキシがGET本文を落とさないことも導入環境で確認します。

JavaScript移行の取り漏れを防ぐ

docker-codesearchの bin/migrate-to-javascript.sh は、同じIDしか増えないページを検出すると、全件に達していなければ失敗終了します。ジョブとデータ設定を両方読み終えてから更新するため、一覧取得失敗で一方だけ移行することを避けます。

移行前には --dry-run で対象を確認します。ページングが効かない旧fessctlでは、1ページに収まる場合を除いて移行を止めるので、先に修正版fessctlを利用してください。旧リリース0.3.0での問題を、単に同じバージョンを再インストールして解消できるとは扱いません。

管理APIの上限を超えない

Fess側にも、一覧APIの件数・ページを結果ウィンドウ内に収める修正が入りました。indexer.max.result.window.size の初期値は10000です。size=10001 は10000に切り詰め、末尾が上限を超えるpageは範囲内の最終ページに補正します。0以下のsize/pageは従来のページャー初期値に委ねます。

上限超えを500にしない改善ですが、ウィンドウを越えて全件を取得できる機能ではありません。終端判定を単なる取得件数の累計にすると同じ最終ページを数えることがあるため、IDの重複と実際の件数を確認してください。

関連PR

fess-kopfで既存インデックスの設定から新しいインデックスを作る

fess-kopfのインデックス作成画面にある「copy from index」を、OpenSearch 2.x/3.xで使えるように修正しました。既存インデックスの設定やマッピングを参考にして、別のインデックスを作成するときの改善です。

設定を読み込んでも作成に失敗していた理由

従来はクラスター状態のメタデータをそのまま作成用JSONへ入れていました。このデータには_docなどの型の下にマッピングが入り、OpenSearchが割り当てるprovided_name、uuid、version、creation_dateも含まれます。そのまま作成すると「The mapping definition cannot be nested under a type」や設定項目のエラーになります。

修正後はマッピングを型の外へ取り出し、上記4つの自動割り当て設定を除いて作成用JSONに変換します。通常のマッピングやrefresh_intervalなどの設定は残ります。画面で既存インデックスを閲覧する処理は、引き続き元のメタデータを使います。

利用手順

修正を含むfess-kopfを用意し、インデックス作成画面で新しいインデックス名を入力します。「copy from index」で元のインデックスを選び、読み込まれたJSONのsettingsとmappingsを確認してから作成します。必要に応じてシャード数や更新間隔などを用途に合わせて調整してください。

このPRはコピー時の変換を修正するもので、新しい初期値や有効化設定を追加するものではありません。コピー元の設定が出発点になります。OpenSearch 3.9.0では、変更したrefresh_intervalとマッピングを引き継いで作成できることがPRで検証されています。

コピーされる範囲

ここでコピーするのは設定とマッピングです。元のインデックスの文書をコピーする機能ではなく、作成したインデックスへデータを入れる工程は別に必要です。スナップショット復元やReindexと同じ処理とは扱わないでください。

OpenSearchへ新規インデックスを作成できる接続と権限が必要です。既存のインデックスを置き換える操作ではないため、新しい名前を使い、作成後に設定とマッピングを確認してから利用先を切り替えます。

関連PR