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

FessのCSV取り込みでコメント直後の空行による読み込み停止を防ぐ

CSVのコメント行と空行を同時に無視する設定で、コメントの直後に空行があると、その後のデータを読み込まず終了する問題が修正されました。エラーを出さず0件のクロールになることもあるため、投入件数の確認が役立ちます。

問題が起きる設定と入力

CSVデータストアのパラメーターで次の2項目を同時に指定した場合が対象です。

ignore_line_patterns=^#.*
ignore_empty_lines=true

例えばコメント、空行、データ行という並びで読み込みが止まりました。ignore_empty_lines の初期値はfalse、ignore_line_patterns は未指定なら行パターンによる除外は行いません。それぞれ単独で指定する使い方は従来どおりです。

修正後の確認手順

両方を指定した場合は、空行も行除外のパターン側で扱うことで、使用ライブラリーの読み込み停止を回避します。コメントと空行がデータの前や途中にあるCSVを使い、修正を含むプラグインでクロール件数と検索結果を確認してください。今回の変更を有効にするための新しい設定はありません。

既存のデータストア設定を維持したままプラグインを更新し、CSVを再クロールして、これまで読み込まれなかった行を登録します。ヘッダーを飛ばす skip_lines や列から本文へのマッピングは別設定なので、読み込み件数が想定と違う場合は併せて確認します。

CSVから消した行はすぐ消えるとは限らない

同日の15.9文書修正では、旧文書の削除条件も明確になりました。delete_old_docs と keep_expires_docs はいずれも初期値trueです。通常は全般設定の「以前のドキュメントを削除」による有効期限が文書に付くため、再登録されなかった文書もkeep_expires_docsによって残り、期限後にドキュメントパージャーが削除します。

CSVの行削除が直ちにインデックス削除になると決めつけないでください。keep_expires_docs=false の指定や有効期限設定の無効化で挙動が変わります。同じデータ設定に別々のCSVを投入して蓄積する環境では、旧文書削除との関係を確認します。この文書変更は削除機能を新設したものではありません。

関連PR