fess-kopfのナビゲーションや項目名も日本語表示へ

Fessから利用するクラスター管理画面のfess-kopfで、ナビゲーション、表の見出し、入力項目名も表示言語に合わせる変更が入りました。説明文やボタンだけでなく、画面を移動したり設定欄を探したりするときの言葉も日本語で読めるようになります。

翻訳される範囲が広がる

今回、ナビゲーション、フォームのラベル、表の列名、統計項目、チェックボックスの説明、ツールチップなどに101個のメッセージキーを追加しました。英語を含む16ロケールに対応します。

英語の原文は従来の表示を維持しています。既存の画面説明やボタンなどの翻訳に加えて、操作対象を探すための表示も言語をそろえる変更です。クラスターへの接続権限やOpenSearchの動作そのものを変えるものではありません。

表示言語の決まり方

言語選択の仕組みは既存のものを使います。Fess管理画面がリクエストから解決した言語を、ダッシュボードのiframe URLのlangパラメーターでfess-kopfへ渡します。通常はAccept-Languageが元になり、管理画面にbrowser_langを指定した場合はその指定が反映されます。

fess-kopf自体のURLで日本語を明示する指定は?lang=jaです。既存のURLにクエリーがある場合は&lang=jaの形で追加します。Fessの管理経路に含まれるトークンやコンテキストパスは環境ごとに異なるので、実際に開いている画面のURLを基に確認してください。

langがない場合はブラウザーの言語を使い、対応言語に解決できなければ英語へ戻ります。タグが完全一致しなければ言語部分を試し、それでも対応しなければ英語です。例えばja-JPは日本語になり、zhだけでは英語になります。翻訳ファイルの読み込みに失敗した場合も英語で表示を続けます。日本語固定が初期値になったわけではなく、新しい有効化スイッチもありません。

APIの名前は原表記を残す

char_filter、content_length、task_id、search_typeなどのJSONキーや識別子、_cat API名、HTTPメソッド、ノードの役割、ステータス値、OpenSearchやFessなどの製品名は翻訳しません。管理画面とAPI応答を照らし合わせるときに、同じ名前で追えるようにするためです。

画面の日本語化でAPIパラメーターまで日本語になるわけではありません。入力するJSONや手順書の識別子は、引き続きOpenSearchの正式なキーを使います。

利用条件と確認ポイント

変更を含むfess-kopfの配信ファイルが必要です。PRでは_siteも再ビルドされていますが、マージ済みであることと正式配布版への反映は別なので、利用中のFessが同梱する版を確認してください。

更新後は日本語の管理画面からダッシュボードを開き、ナビゲーションや作成画面の項目名が日本語になるかを確認します。英語以外の15言語の追加文言は機械翻訳で、ネイティブ話者による確認はされていません。運用手順に転記する際は実際の表示と意味を確認するとよいと思います。

関連PR

Fessでnoindexページの繰り返し取得を抑える修正

検索結果に表示したくない一覧ページへnoindexを付けていると、相互リンクをたどって同じページを何度も取得し、クロールが終わりにくくなることがあります。Fessに、noindexページを「取得済み・インデックス対象外」として記録する修正が入りました。

インデックスしないページも訪問済みにする

従来はnoindexを検出すると、リンク先をキューへ渡した後に例外で処理を終了し、アクセス結果を保存していませんでした。キューが直近に取り出したURLを覚える枠は標準で100件なので、その範囲から外れたnoindexページは、別のページからリンクされると再取得されることがありました。

修正後はアクセス結果を保存し、indexingTarget=falseとして検索インデックスへの登録を省きます。取得した記録が残るため、同じクロールセッション内で再び候補に上がっても訪問済みと判断できます。次回以降のクロールまで永久に取得しなくなる設定ではありません。

noindexとnofollowの使い分け

HTMLなら次の指定が対象です。

<meta name="robots" content="noindex">

HTTPのX-Robots-Tag: noindexヘッダーも対象です。noindexだけなら、そのページ自体をインデックスせず、ページ内のリンク先は引き続きクロールします。リンク先もたどりたくない場合はnoindex,nofollowまたはnoneを指定します。この場合はページを訪問済みとして記録しつつ、リンクを保存・キュー登録しません。

crawler.ignore.robots.tagsの初期値はfalseで、robots指定を尊重します。既存設定でtrueにしている場合はrobots指定を無視する従来の扱いが続きます。この修正専用の新しい設定キーはありません。

クロール件数の上限に注意

noindexページもアクセス結果を保存するため、修正後はmaxAccessCountのカウント対象になります。上限を設定しているクロールでは、検索対象外の一覧ページを経由する分も含めて、目的のページまで到達できるか確認してください。

PRの検証例では、相互リンクするnoindexページの繰り返し取得が減っていますが、すべてのURLを必ず1回だけ取得する保証ではありません。404、リダイレクト、canonicalによる転送など、別の理由でアクセス結果が残らない経路は今回の変更対象外です。既存の検索文書を一括削除する機能でもありません。

適用時の確認

修正を含むFessのビルドを検証環境へ用意し、noindexだけのページとnoindex,nofollowのページで動作を比較します。アクセスログで同じURLへの取得回数を確認し、noindexページが検索結果へ出ないこと、必要なリンク先へ到達すること、件数上限に先に達していないことを確認してから運用へ反映します。

既存のnofollow維持の修正は、本文を省略する増分クロール時のリンク再利用を扱うものです。今回の変更はnoindexページを訪問済みとして記録する問題への対応で、確認すべき場面が異なります。

関連PR

Fessの実験的なNotion連携で検索対象と権限を設定する

Notionのページやデータベース行をFessで横断検索したい場合、実験的なデータストアプラグインfess-ds-notionを利用できます。Fess 15.9向けのREADMEでは、対象IDの指定方法、権限の制限、クロールが失敗した場合の扱いが明確になりました。コピーしたトークンの前後の空白を除去する修正もマージされています。

2026年10月16日確認時点で、関連PRはマージ済み、Fess本体15.9.0は正式公開済みです。ただし、この連携は実験的な提供であり、設定や動作が今後変わる可能性があります。本体の公開と、個別プラグインの動作保証を分けて検討してください。

導入とNotion側の準備

必要条件はFess 15.9以降とJava 21以降です。対応するプラグインJARを管理画面のプラグイン機能で導入するか、app/WEB-INF/plugin/へ配置してFessを再起動します。

Notionでは内部インテグレーションを作成し、Read contentを付与したうえで、検索対象のページやデータベースにそのインテグレーションを明示的に追加します。権限項目を有効にするだけではページへのアクセスは付与されません。コメントを取得するならRead commentsも必要です。

Fessのデータストア設定でNotionDataStoreを選択し、例えば次のパラメーターを設定します。シークレットとIDは実際の値へ置き換えてください。

token=ntn_REPLACE_WITH_INTERNAL_INTEGRATION_SECRET
root_page_ids=REPLACE_WITH_PAGE_ID
script_type=javascript

root_page_idsとdatabase_idsにはURLではなくIDを指定し、複数ならカンマで区切ります。両方が空の場合はインテグレーションと共有された対象を検索APIから発見しますが、網羅性は保証されないため、対象漏れを避けたい場合はIDを明示します。子ページ・子データベースもたどります。

スクリプトには次のようにフィールドの対応を設定します。

title=notion.title
content=notion.content
url=notion.url
mimetype=notion.mimetype
last_modified=notion.last_edited_time
created=notion.created_time

データストアのscript_typeが未設定だとGroovyに解決されます。15.9ではGroovyエンジンを同梱しないため、JavaScriptを明示するか、Groovyプラグインを別途導入してください。

初期値と実行条件

パラメーター初期値
root_page_ids / database_ids空
include_comments / include_filestrue
max_file_size10485760バイト(10MB)
request_interval350ミリ秒
max_retry_count5
connection_timeout / read_timeout10000 / 30000ミリ秒
ignore_errortrue

毎回全件クロールし、単一スレッドで処理します。number_of_threadsとreadIntervalは使われず、HTTPプロキシにも対応しません。ファイル対象はNotionがホストするfile/pdfブロックの添付で、外部リンク先を一律に取り込む機能ではありません。

include_patternとexclude_patternは個別文書の登録可否を決めます。親ページを除外しても子ページの探索は続くため、サブツリー全体を対象外にする場合は子のURLも含めた設計が必要です。

Notionのページ別権限は同期しない

このプラグインはNotionのページ別共有権限を取得して同期できません。全文書にはFessのデータストア設定の「アクセス権限」が一律に適用されます。

インテグレーションと共有した情報は、そのFess権限を持つ利用者が検索できます。公開してよい範囲にインテグレーションの共有を絞り、Fess側も匿名利用者を含めた権限を確認してください。Notionで個別ページを見られない利用者が、Fessでは検索できる構成にならないか、複数ユーザーで確認します。

クロール後の確認

Read content不足では403でページごとにスキップされ、何も登録されない場合があります。コメント権限不足は警告を出し、そのクロールの残りのコメント取得を停止します。

401、特定のレート制限ブロック、対象ID未指定時の検索API失敗ではクロール全体が中断します。中断時には、同じ設定の既存文書のうち今回再登録できなかったものが削除される場合があるため、トークン更新や広範囲の本番実行前に小さな対象で試します。

失敗URL画面ではページID・データソースID、添付ならページURLとブロックIDを確認します。ignore_error=trueはダウンロード済み添付のテキスト抽出失敗を空本文として登録する設定で、ダウンロード失敗まで無視する設定ではありません。

関連PR