コンテンツにスキップ

取り込み対象の決定

扱うこと: クロールで見つけたファイルを取り込み対象にするかどうかの判定(更新の判定・前の抽出版・インデックスが無くなった・壊れている場合・元ファイルが無くなった場合)、画面の確認に出す取り込み予定と件数。扱わないこと: クロール対象フォルダの登録・インデックス名(クロール対象フォルダと取り込み対象)、強制終了・時間切れからの再開そのもの(取り込み一覧)。先に読むページ: クロール対象フォルダと取り込み対象。

取り込み対象の決定(createTargetList)

flowchart TD
    A["取り込み一覧を読む(readStatusFile)"] --> N["インデックス名の割り当て(assignIndexNames)<br>設定から外れたインデックスを見つける(findDroppedIndexes。削除は確認で[更新を開始]が押された後)<br>本文インデックスに入れていない TSV を本文インデックスに書き出す"]
    N --> C["インデックスにある本文インデックスのファイル・TSV の数を数える(getIndexTsvCounts)"]
    C --> FOLDER{"クロール対象フォルダごと(設定の順)"}
    FOLDER -- "チェックなし・フォルダが見つからない" --> KEEP["取り込まない<br>前回の行をそのまま残す"]
    FOLDER -- チェックあり --> SCAN["フォルダを再帰検索"]
    SCAN --> EACH{"各ファイルの判定"}
    EACH -- "一覧と更新日時・サイズが同じで『済』<br>かつインデックスがそろっている" --> DONE["取り込まない"]
    EACH -- "『済』だが本文インデックスのファイルも TSV も無い・足りない・0 バイト<br>(testIndexComplete)" --> TARGET
    EACH -- "一覧と更新日時・サイズが同じで『失敗』" --> FAILED["前回失敗(確認の対象)"]
    EACH -- "上記以外(新規・更新あり・未取り込み)" --> TARGET["取り込み対象(『未取り込み』)"]
    DONE & FAILED & TARGET --> DEL["このフォルダの行で見つからないファイル:<br>TSV を削除して一覧から除き、Removed で返す<br>(呼び出し元が本文インデックスから外す)<br>数えた件数を取り込み予定の1行にする(newIngestPlanRow)"]
    KEEP & DEL --> Q{"前回失敗が 1 件以上?"}
    Q -- はい --> Q1{"RetryFailed?<br>(画面で「失敗分も再取り込みする」を選んだ・-RetryFailed)"}
    Q1 -- はい --> ADD["前回失敗も取り込み対象に加える"] --> INT
    Q1 -- いいえ --> INT
    Q -- いいえ --> INT{"ジャーナルでやり直す仕事(すべて)が取り込み対象にある?<br>(前回、取り込み中に強制終了した)"}
    INT -- "はい(1 回目)" --> LAST["取り込み対象の最後に回す"] --> W
    INT -- "はい(続けて 2 回目)" --> FAIL2["『失敗』にして取り込み対象から除く"] --> W
    INT -- いいえ --> W["取り込み一覧を書き出す(writeStatusFile)"]
  • 更新の判定: 更新日時(秒まで)とサイズのどちらかが取り込み一覧と異なれば「更新あり」。古い版に戻した場合も再取り込みされる。
  • 前の抽出版で取り込んだファイル: 更新が無く 済 でも、取り込み一覧の「抽出版」がその形式の今の版(getExtractVersion)より小さければ取り込み直す(getIngestDecision の outdated)。ツールの版を上げて読み取る内容が増えたとき(例: Excel の図形・コメント)、既存のインデックスにも反映するため。件数は「更新あり」に数える。前回 失敗 のファイルは、抽出版によらず「前回失敗」のまま。
  • 一覧に無いファイル(初回・取り込み一覧を削除した後)は、すべて取り込み対象にする(本文インデックスの中の元のファイルは、中身を読まないと分からないため調べない)。
  • インデックスが無くなった・壊れているファイル: 取り込み一覧が 済 でも、次のどちらかに当てはまれば取り込み直す(testIndexComplete)。一覧だけを見ると 済 のままになり、検索しても出てこない状態が続くため。
  • そのファイルのフォルダ・拡張子の本文インデックスのファイル(work/store/content/<相対フォルダ>/content_index.<拡張子>.<番号>.tsv)が無いか 0 バイトで、本文インデックスに入れる前の TSV(work/store/content/<相対パス>/*.tsv)も無い・記録した TSV 数より少ない(work/store/content のフォルダ・ファイルを直接削除した場合)。本文インデックスのファイルがあれば(0 バイトでなければ)、そろっているものとする。
  • 本文インデックスに入れる前の TSV に 0 バイトのものがある(書き込みの途中で電源が落ちた場合など)。空のシート・ページは保存しない(prettyTsv / writeUnits)ため、0 バイトの TSV は正常には作られない。
  • 1 ファイルずつ調べると件数の分だけ時間がかかるため、取り込み対象を調べる前に、インデックスのフォルダとファイルをそれぞれ 1 回ずつ列挙して数える(getIndexTsvCounts。本文インデックスのファイルはそのファイルの相対パス → 1(0 バイトなら壊れている印)、本文インデックスに入れる前の TSV はフォルダの相対パス → TSV の数。大きさは列挙のときに分かる)。列挙できない場合(アクセス権が無い等)は確認しない。TSV 数を記録していない行も、本文インデックスのファイルが無ければ確認しない。
  • 本文インデックスのファイルの中身の書き換え・一部の欠け(手で編集した等、0 バイトでないもの)までは分からない(本文インデックスのファイルの中の元のファイルごとの場所の数は数えない)。その場合は画面でインデックスを[削除]してから作成し直す(インデックス一覧の管理)。
  • 元ファイルが無くなったファイル(削除・名前変更・移動)は、そのファイルのインデックスのフォルダ(work/store/content/<相対パス>。本文インデックスに入れる前の TSV)があれば削除して一覧から除き、相対パスを Removed で返す。インデクサはそのフォルダを書き出し待ちにし、本文インデックスから外す(入れ替えと書き出し「本文インデックスへの書き出し」)。元ファイルが無くなった N 件は、インデックスから除きます。 を表示する。ただし、クロール中にアクセスできないフォルダがあった場合は、見つからないだけの可能性があるため削除せず一覧に残し、その旨を表示する。
  • フォルダごとに [<インデックス名>] <パス> と、クロール後に [<インデックス名>] 対象ファイル N 件(取り込み済み A 件 / 新規 B 件 / 更新あり C 件 / 前回未完了 D 件 / 前回失敗 E 件) を表示する。インデックスが無くなった・壊れているファイルがあるときだけ / インデックスが無い・壊れている F 件 を付け、続けて インデックス(TSV)が無くなった・壊れている F 件は取り込み直します。(インデックスを直接削除した・0 バイトのTSVが残っている) を表示する。チェックなしのフォルダは … チェックなしのため取り込みません(インデックスはそのまま残します) と表示する。
  • インデックス作成中は [i/N] <インデックス名>\<相対パス> を表示する。元ファイルのパスは、相対パスの先頭のインデックス名からクロール対象フォルダを引いて求める。

クラウドにだけあるファイル

OneDrive・SharePoint の「ファイル オンデマンド」で、中身がこの PC に無く、開くとダウンロードが始まるファイルは、既定では読み込まずに残す。

  • 見分け方: クロールが返すファイルの属性(フォルダの一覧と同時に分かる)だけで見分け、ファイルは開かない(testCloudOnlyAttributes)。RECALL_ON_DATA_ACCESS(0x400000)・RECALL_ON_OPEN(0x40000)・OFFLINE(0x1000)のどれかが付いていればクラウドにだけある。「常にこのデバイスに保持」(0x80000)・「空き容量を増やす」の印だけ(0x100000)・再解析ポイントだけの場合は、クラウドにだけあるとはみなさない。
  • 調べる範囲: 読み込む必要のあるファイル(新規・更新あり・前回未完了・インデックスなし)と、前回失敗したファイルだけ。最新のファイルは属性を見ない。
  • 既定は残す: 実行のたびに決め直す(記録は持たない)。残したファイルに前回の行があればその行をそのまま残し、無ければ一覧に行を作らない。前回の行が「前回未完了」のときは、確認の返事のあと、前回の行を残さず(一覧に行を作らず)、取り込み途中のインデックスのフォルダを消し、本文インデックスからも外す(入れ直しの印。取りやめなら前回の行と取り込み済みの中身を残す。フォルダは起動時に本文インデックスのファイルへまとめる)。
  • 取り込む: 受け渡しの口の IncludeCloud(画面の確認でチェックを付けた、またはヘッドレスで設定 cloudFiles が download)のとき、splitCloudItems が取り込み対象に加える。前回失敗したものは RetryFailed のときだけ加える。
  • 件数: 取り込み予定の クラウド(新規などの取り込み対象のうちクラウドにだけあるもの)・クラウド失敗(前回失敗のうち、同じくクラウドにだけあるもの)と、それぞれの合計サイズ(クラウド容量・クラウド失敗容量)。取り込み対象の件数には含めない。再取り込みしない前回失敗は「残したファイル」に数えない。
  • インデックス作成ログに、インデックスごとの件数と相対パスを書く。

取り込み予定(画面の確認に出す件数)

受け渡しの口の ConfirmTargets(画面から実行したとき)なら、取り込み対象を決めた後、インデックスごとの件数を 1 行にし(newIngestPlanRow)、受け渡しの口の Plan に入れる(IndexingReporter.WaitForApproval)。 画面はこれを読んで確認のダイアログを出す(インデックス作成の確認ダイアログ)。返事を受け取ったら Plan を外す。次の例は、1 行を列の順にタブで区切って並べたものである。

インデックス名 元のフォルダ  区分  ファイル数   取り込み対象  新規  更新あり    前回未完了   インデックスなし    前回失敗    クラウド    クラウド失敗  クラウド容量  クラウド失敗容量
営業  C:\data\営業  取り込み    1234    12  5   7   0   0   3   2   0   10485760    0
2019年度  D:\old\2019年度   チェックなし  0   0   0   0   0   0   0   0   0   0   0
  • 区分: 取り込み(チェックが付いていて元のフォルダもある。数えた結果を書く)/ チェックなし / フォルダなし。後の 2 つは数えないため、件数はすべて 0。
  • 取り込み対象 = 新規 + 更新あり + 前回未完了 + インデックスなし。前回失敗は含めない(画面の確認で「失敗分も再取り込みする」を選んだときだけ対象になる)。

取り込み一覧の各ファイルの状態遷移:

stateDiagram-v2
    direction TB
    state "未取り込み" as New
    state "済" as Done
    state "失敗" as Failed

    [*] --> New : クロールで見つかった(一覧に無い)
    New --> Done : 取り込み成功
    New --> Failed : 取り込み失敗 / 制限時間超過 / 取り込み中に続けて 2 回強制終了
    New --> New : 画面の[中止]・取り込み中に強制終了 → 次回取り込み(強制終了したファイルは最後に)
    Done --> New : 元ファイルが更新された / インデックス(TSV)が無くなった・壊れた / 前の抽出版で取り込んだ
    Failed --> New : 元ファイルが更新された / -RetryFailed
    Done --> [*] : 元ファイルが無くなった(本文インデックスから外す)
    Failed --> [*] : 元ファイルが無くなった
    New --> [*] : 元ファイルが無くなった(取り込みの直前に無くなった場合を含む)

クロールで列挙するファイルの条件(findTargetFiles):

  • 拡張子が .xlsx .xlsm .xls .xlsb .docx .docm .doc .pptx .pptm .ppt(Office、10 個)または 対象の拡張子(テキスト、75 個)(大文字・小文字を区別しない)。テンプレート(.xltx .dotx .potx 等)は対象外
  • ファイル名が ~$ で始まるもの(Office のロックファイル)は除外
  • アクセスできないサブフォルダは無視して続行(元ファイルが無くなったかどうかの確認は行わない)
  • ジャンクション・シンボリックリンクは辿らず、取り込まない(getFilesNoFollow。リンクの先のフォルダへは降りず、ファイルのリンクも対象にしない)。飛ばしたリンクは 1 件 1 行でログに出す。クロール対象フォルダそのものがリンクのときは、これまでどおりその先の中を読む(中のリンクだけを辿らない)。OneDrive のオンデマンドのように、ReparsePoint が付いていてもリンクと確かめられないものは、これまでどおり取り込む
  • 相対パスは、実際に列挙したフォルダ(Resolve-Path で解決した Root。findTargetFiles が返す)から求める。列挙したファイルのパスが \\?\ 付きの Root で始まれば先頭を切り落とし(ファイルが多いときに速い)、そうでなければ getPathUnderFolder で求める。 設定に書かれたパスとは書き方が違うことがあるため(末尾の \、\\?\ 付き、. ・ .. を含む、/ 区切り)、設定のパスの文字数では切り出さない
  • tebunko が作ったファイル(今のワークスペースの中身・取り込み一覧(ingest_status.tsv)や目録(store\format.tsv)の印があるほかのワークスペースの中身・名前で分かる本文インデックス)は対象に含めない(テキストの拡張子(.tsv 等)でこれらを拾わないため。詳細は テキストファイルの読み取り)

各ファイルは拡張子で抽出方法を振り分ける(ingestFile)。.xls* は Excel の抽出処理(Excel、Excel)、.doc* .ppt* は Word・PowerPoint の抽出処理(Word・PowerPoint 共通、Word・PowerPoint の共通処理と Office アプリの管理)と Word の旧形式の変換(Word、Word)・PowerPoint の旧形式の変換(PowerPoint、PowerPoint)。テキストの拡張子は テキストファイルの抽出処理(extractTextFile)。 成功時は TSV N 件を作成しました。 を表示する。