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

Fessのインデックスエクスポートで保存先と実出力件数を確認する

Fessのインデックスエクスポートでは、保存先に書き込めなくてもジョブログが正常終了となり、取得した件数が出力件数として表示される場合がありました。保存先の事前検査と、実際に書き出した件数の集計を追加する修正がマージされました。

既存のHTML/JSONエクスポート機能に対する運用上の改善です。

保存先の初期値

開発版で確認した設定は次のとおりです。

設定初期値
index.export.path/var/lib/fess/export
index.export.formathtml
index.export.exclude.fieldscache,tag
index.export.scroll.size100

保存先の初期値は今回の修正でも変わりません。ZIP版を一般ユーザーで動かす場合、/var/lib/fess/exportへ書き込めないことがあります。Fess実行ユーザーが書き込める専用ディレクトリを用意し、環境に合わせて設定してください。

index.export.path=/home/fess/export

これは例のパスです。Fessプロセスから見える場所と権限を確認し、設定を反映してジョブを実行します。

修正後の結果の読み方

修正後は検索開始前にディレクトリを作成し、一時ファイルの作成・削除で書き込みを確認します。失敗するとindex.export.pathと保存先を含むエラーでジョブが失敗します。

一方、処理途中で個々の文書を書き出せない場合は、その件数を結果へ追加します。Exported N documents.は実際に書けた件数となり、URLがない文書などのスキップも出力件数へ含めません。事前検査の成功は全ファイルの成功を保証しないので、未出力件数とログを合わせて確認してください。

スケジュールの書き方

関連文書PR #599では、cronを5項目の形式へ訂正しています。毎日午前2時なら次の式です。

0 2 * * *

順番は「分 時 日 月 曜日」です。秒を含む6項目やQuartzの?は使いません。実行時刻はFess側のタイムゾーンに合わせて確認してください。

この変更はバックアップ復元機能ではありません。書き出し先の容量や古いファイルの整理も別途運用し、終了状態だけでなく実ファイルの有無と内容を確認してください。

関連PR