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

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です