概要
Notionコネクタは、Notionのページとデータベースの行を取得して Fess のインデックスに登録する機能を提供します。 Notionの内部インテグレーションとして認証し、そのインテグレーションに共有されているすべてのコンテンツを索引対象にします。
この機能には fess-ds-notion プラグインが必要です。
対応コンテンツ
ページ(ブロックのテキスト)
データベースの行(プロパティ値を含む)
Notionにホストされたファイルブロックとpdfブロックの添付ファイル(それぞれ独立した文書として索引化します)
ページの未解決コメント(ページの文書に取り込みます)
以下は対象外です:
Notionの外部にあるファイル(外部リンクのファイル)。ダウンロードするのはNotionにホストされた
fileブロックとpdfブロックのみですNotionのゴミ箱に入っているページとデータベースの行
ページ単位のアクセス制御(後述の「権限」を参照)
前提条件
プラグインのインストールが必要です
Notionの内部インテグレーションの作成が必要です
クロール対象のページとデータベースをインテグレーションに共有する必要があります
プラグインのインストール
管理画面の「システム」→「プラグイン」からインストールするか、bin/fess-setup install plugin fess-ds-notion を実行して Fess を再起動します。 詳細は プラグイン を参照してください。
Notionインテグレーションの設定
Notionで内部インテグレーションを作成し、「内部インテグレーションシークレット」(Internal Integration Secret)をコピーします。
インテグレーションの設定ページ(Configuration)で、以下のケイパビリティを有効にします:
ケイパビリティ 必須 用途 コンテンツの読み取り(Read content) 常に必須 ページ、ブロック、データベース、データベースの行の読み取り。無効にすると、すべてのリクエストが 401 unauthorizedで失敗し、クロールは即座に中止されますコメントの読み取り(Read comments) include_comments=true(既定)の場合のみページのコメントの取得。無効の場合、警告を1回ログに出力し、そのクロールの残りではコメントの取得を無効にします。クロール自体は失敗しません ユーザー情報の読み取り(Read user information) 任意 ユーザーID( created_by、last_edited_by、peopleプロパティ)の表示名への解決。無効の場合は、名前の代わりにユーザーIDが索引化されますクロール対象のすべてのページまたはデータベースを、Notion上でインテグレーションに共有します。 ケイパビリティを追加しただけでは、どのコンテンツにもアクセスできるようにはなりません。
設定方法
管理画面から「クローラー」→「データストア」→「新規作成」で設定します。
基本設定
| 項目 | 設定例 |
|---|---|
| 名前 | Company Notion |
| ハンドラ名 | NotionDataStore |
| 有効 | オン |
パラメーター設定
パラメーター一覧
| パラメーター | 必須 | 説明 |
|---|---|---|
token | はい | 内部インテグレーションシークレット。スクリプトには渡されず、ログにも出力されません |
root_page_ids | いいえ | クロールの起点にするページIDのカンマ区切りリスト。これと database_ids の両方が空の場合は、Notionの検索でインテグレーションに共有されているすべてのページとデータベースを探索します |
database_ids | いいえ | クロールの起点にするデータベースIDのカンマ区切りリスト。各データベースのすべての行を索引化します |
include_comments | いいえ | 各ページの未解決コメントを取得し、そのテキストを notion.content と notion.comments に含めます(デフォルト: true) |
include_files | いいえ | Notionにホストされた file ブロックと pdf ブロックの添付ファイルをダウンロードしてテキストを抽出し、それぞれを独立した文書として索引化します(デフォルト: true) |
max_file_size | いいえ | このバイト数を超える添付ファイルは、空のコンテンツでも索引化せず、完全にスキップします(デフォルト: 10485760) |
include_pattern | いいえ | 文書の notion.url が一致する必要がある正規表現(「クロール範囲」を参照) |
exclude_pattern | いいえ | 文書の notion.url が一致してはいけない正規表現(「クロール範囲」を参照) |
request_interval | いいえ | Notionのレート制限(毎秒約3リクエスト)を超えないよう、各APIリクエストの前に待機するミリ秒数(デフォルト: 350) |
max_retry_count | いいえ | 429、5xx、529 の応答、またはタイムアウトなどの通信エラーになったリクエストの最大リトライ回数(デフォルト: 5) |
connection_timeout | いいえ | 各APIリクエストの接続タイムアウト(ミリ秒、デフォルト: 10000) |
read_timeout | いいえ | 各APIリクエストの読み取りタイムアウト(ミリ秒、デフォルト: 30000) |
ignore_error | いいえ | ダウンロードできた添付ファイルのテキスト抽出に失敗した場合に、文書を失敗扱いにせず、空のコンテンツで索引化します(デフォルト: true)。ダウンロードの失敗は、この設定に関係なく常に文書の失敗になります |
注釈
数値パラメーターに空値または数値でない値を指定すると、警告をログに出力して既定値を使用します。 request_interval と max_retry_count に負の値を指定した場合(0 はどちらも有効)や、 true / false のパラメーターにそれ以外の値を指定した場合も同様です。
スクリプト設定
利用可能なフィールド
ページ、データベースの行、添付ファイルのすべての文書は、スクリプトから notion オブジェクトとして参照できます。
| フィールド | 説明 |
|---|---|
notion.type | ページまたはデータベースの行は page、添付ファイルは file |
notion.id | ページID。添付ファイルの場合はブロックID |
notion.title | ページのタイトル(名前に関係なく、型が title のプロパティ)。添付ファイルの場合はファイル名 |
notion.content | ページの場合: タイトル以外のプロパティ値(データベースの行のみ)、ブロックのテキスト、コメントのテキストを連結したもの。添付ファイルの場合: 抽出したテキスト |
notion.url | ページのNotion URL。添付ファイルの場合は、含まれるページのURLの末尾に #<ブロックID> を付けたもの |
notion.mimetype | ページは text/html、添付ファイルは検出したMIMEタイプ |
notion.created_time | ページの作成日時。添付ファイルでは利用できません |
notion.last_edited_time | ページ(または添付ファイルのブロック)の最終編集日時 |
notion.created_by | ページの作成者。Notionが名前を返した場合は名前、そうでなければユーザーID。添付ファイルでは利用できません |
notion.last_edited_by | 最終編集者(同じ形式)。添付ファイルでは利用できません |
notion.parent_id | 親のページ、データベース、データソース、ブロックのID。ワークスペース直下のページでは空。添付ファイルでは利用できません |
notion.properties | データベースの行の、列名から整形済みテキストへのマップ。通常のページでは空。添付ファイルでは利用できません |
notion.comments | ページのコメントのテキストを連結したもの。include_comments=false の場合やコメントがない場合は空。添付ファイルでは利用できません |
notion.page_url | 含まれるページのURL。添付ファイルのみ |
notion.page_title | 含まれるページのタイトル。添付ファイルのみ |
notion.size | 添付ファイルのバイト数(Notionが返した場合)。添付ファイルのみ |
クロール範囲
root_page_idsとdatabase_idsのどちらも指定しない場合は、Notionの検索でインテグレーションに共有されているすべてのページとデータベースを探索します。 Notionの検索はすべてを網羅することが保証されていません。索引にないコンテンツがある場合は、root_page_idsまたはdatabase_idsを明示的に指定してください。各起点から辿れる子ページと子データベースもすべてクロールするため、通常は1つのルートページを指定すれば、ワークスペースの1つのセクション全体に届きます。
include_patternとexclude_patternが決めるのは、そのページ(または添付ファイル)自身の文書を索引化するかどうかだけです。 子孫の探索は止まりません。ページのブロックは、ページ自身のURLに対してパターンを判定する前に必ず辿るため、 除外したページの子ページも、それぞれのURLで引き続きクロールされ、索引化されます。 サブツリー全体を除外するには、ルートだけでなく、その配下のすべてのURLに一致するパターンを指定してください。Notionのゴミ箱に入っているページとデータベースの行はスキップします。
権限
Notion APIはページの共有設定を公開していないため、このコネクタはページ単位のアクセス制御を同期できません。 すべての文書は、データストア設定の「権限」フィールドに設定した権限だけで索引化されます。
警告
インテグレーションに共有したすべてのコンテンツは、Notion上で誰が閲覧できるかに関係なく、このフィールドで許可したロールで検索できるようになります。 それらのロールに検索させてよいページとデータベースだけを、インテグレーションに共有してください。
エラー処理
クロールが中止されるのは、HTTP
401(トークンで認証できない)、またはpublic_api_request_blockedを示す429応答 (Notionのレート制限によってインテグレーションがブロックされた)の場合だけです。root_page_idsもdatabase_idsも指定していないときにNotionの検索が失敗した場合も、起点がなくなるためクロールが中止されます。それ以外の失敗は文書ごとに処理されます。1つのページ、データベース、コメントスレッド、ブロックに対する
404や403、 1つのリクエストでmax_retry_countを使い切った場合は、ログに記録してスキップし、クロールを続行します。文書ごとの失敗は、その文書のURL(ページはNotion URL、添付ファイルは
<ページのURL>#<ブロックID>)で 「クローラー」→「障害URL」に記録されます。 添付ファイルの署名付きダウンロードURLは、記録もログ出力もされません。パラメーターに
keep_expires_docs=falseを指定すると、クロールで再索引化されなかったデータストアの文書は、クロール終了時に削除されます。 これは、中止したクロールでも同様です。 既定では、文書には有効期限が付き、その期限が過ぎるまで索引に残ります。
使用例
特定のページツリーをクロール
パラメーター:
スクリプト:
データベースをクロール
パラメーター:
スクリプト:
インテグレーションに共有されたすべてをクロール
パラメーター:
トラブルシューティング
クロールが 401 ですぐに中止される
トークンがインテグレーションの「内部インテグレーションシークレット」であること、「コンテンツの読み取り」ケイパビリティが有効であることを確認してください。
索引にないページがある
ページまたはデータベースがインテグレーションに共有されていることを確認します
探索に任せている場合は、Notionの検索がすべてを網羅するとは限らないため、
root_page_idsまたはdatabase_idsを明示的に指定しますinclude_patternとexclude_patternを確認します「クローラー」→「障害URL」で、個別に失敗した文書を確認します
コメントが索引化されない
インテグレーションの「コメントの読み取り」ケイパビリティを有効にしてください。無効の場合は、警告を1回ログに出力し、そのクロールではコメントをスキップします。 索引化されるのは、未解決のコメントだけです。
参考情報
データストアコネクタの概要 - データストアコネクタ概要
Slackコネクタ - Slackコネクタ
データストアクロール - データストア設定ガイド
障害URL - 障害URL
プラグイン - プラグイン管理ガイド