インデックス作成¶
扱うこと: インデックス作成(インデクサ)の概要・起動方法・入出力・ファイルの種類ごとの抽出方法の一覧。扱わないこと: メインフローの詳細(インデックス作成のメインフロー)、クロール対象フォルダと取り込み対象の決定(クロール対象フォルダと取り込み対象・取り込み対象の決定)、インデックスのファイルの形(インデックスのファイルの形)。先に読むページ: 設計の概要。
インデックスとは(はじめて読む方へ)¶
インデックスは、元のファイル(Office ファイル・テキストファイル)から抽出した文字列を、検索用に前もって保存した索引データである。書籍の巻末索引と同様に、検索のたびに元のファイルを開く処理を省くために用いる。利用者向けの説明は インデックスの仕組み にある。本節では、インデックスの内容を具体例で示す。
例: C:\共有\営業部\見積\(株)山田商事_見積書.xlsx に「見積」シートがあり、1 行目に 品名 数量 単価、2 行目に りんご 10 100 と書いてあるとする。
flowchart LR
X["(株)山田商事_見積書.xlsx<br>シート「見積」"] -- "① 取り込み<br>Excel でシートを<br>テキストに書き出す" --> T["場所ごとの TSV<br>(1 行 = Excel の 1 行)"]
T -- "② フォルダの取り込みが<br>終わったら本文インデックスに入れる" --> P[("本文インデックス<br>store/content/営業部/見積/<br>content_index.xlsx.001.tsv")]
P -- "③ 検索は<br>本文インデックスだけを読む" --> R["結果: (株)山田商事_見積書.xlsx<br>見積・2 行目「りんご…」"]
- 取り込み:元のファイルを読み(Office ファイルもテキストファイルも PDF ファイルも、作業領域にコピーしたコピーを開く・読む)、シート・ページ・スライドなどの場所ごとに、文字を TSV(タブ区切りのテキスト)に書き出す。1 行が Excel の 1 行(Word・PowerPoint では段落 1 つ)にあたるので、検索結果に「何行目か」を出せる。
-
本文インデックスに入れる:フォルダの取り込みが終わると、そのフォルダの TSV を、フォルダ・拡張子ごとの本文インデックスにまとめる。本文インデックスには、どのファイルのどの場所かを示す行(メタ情報の行)と、TSV の中身が並ぶ。
␞ ファイル名=(株)山田商事_見積書.xlsx ␞ 種類=Excel ␞ シート=見積 ␞ 対象=本文 品名→数量→単価 りんご→10→100(
␞はメタ情報の行の印、→はタブ。形式の詳細は インデックスのファイルの形) 3. 検索:検索は本文インデックスだけを順に読んで照合する。ファイル 1 つにつき 1 回開くのではなく、大きな本文インデックスをまとめて読むので速い(検索を速くする仕組み)。
インデックスは、ワークスペース(既定は %USERPROFILE%\Documents\tebunko_ws。設計書では work/ と書く)に置く次のものでできている。
| もの | 置き場所 | 役割 |
|---|---|---|
| 本文インデックス | work/store/content/<インデックス名>/<フォルダ>/content_index.<拡張子>.<番号>.tsv |
検索が読む本体。インデックス名は、画面で登録したフォルダ(クロール対象フォルダ)1 つごとの名前 |
| 取り込み一覧 | work/store/ingest_status.tsv |
どのファイルを、いつ、どの版で取り込んだか。2 回目からは、ここと比べて新しいファイル・変わったファイルだけを取り込む(差分取り込み) |
| 2-gram の索引 | work/store/gram/<インデックス名>/ |
検索で照合する本文インデックスのファイルを絞る(2-gram の索引)。作り直せる |
インデックスは元のファイルから作り直せる。消しても元のファイルは失われず、次のインデックス作成ですべて取り込み直す。
| 項目 | 内容 |
|---|---|
| 起動 | 画面の[インデックス管理]タブの[すべて更新](インデックス作成の実行)。画面は自分のプロセスの中のスレッド(インデクサの司令)で indexer.ps1 -Channel を実行する(IndexingSession。プロセスとスレッド)。画面を使わずにコンソールから indexer.ps1 を実行することもできる |
| スクリプト | scripts/tebunko/indexer.ps1(起動口)、scripts/tebunko/indexer/indexer_run.ps1(本体 invokeIndexer・取り込みのスレッド)、scripts/shared/office/office_reader.ps1(Word・PowerPoint の読み取り) |
| 引数 | -RetryFailed(省略可): 前回失敗し、その後更新されていないファイルも再取り込みする-Channel(省略可。画面から実行するときに渡す): 受け渡しの口(newIndexerChannel)。取り込む前の確認・中止・進み具合・エラーはこれでやり取りする(確認するかは口の ConfirmTargets、失敗分の再取り込みは口の RetryFailed で決まる)。省略すると自分で口を作り、確認はせず、表示内容をコンソールにも出す |
| 終了コード | 0 完了(ファイルごとの失敗は取り込み一覧に記録)/ 1 続けられないエラー(内容は受け渡しの口の Error とログ)/ 2 中止(確認で取りやめた場合を含む)。受け渡しの口の ExitCode にも入れる |
| 使用する共通関数 | getTargetFolders / assignIndexNames / normalizeFolderPath / readStatusFile / writeStatusFile / addStatusRow / newStatusRow / formatFileTime / toSafeFileName / toIndexFileName / encodeIndexPlace / prettyTsv(部品ごとの関数) |
全体構成・動作環境・フォルダ構成は 設計の概要 を参照。
この区分のページ¶
- インデックス作成のメインフロー
- 取り込み一覧
- クロール対象フォルダと取り込み対象
- 取り込み対象の決定
- 取り込みの並列化
- Word・PowerPoint の共通処理と Office アプリの管理
- Excel
- Word
- PowerPoint
- エラーメッセージ一覧
- 既知の問題
概要¶
画面で登録したクロール対象フォルダ(setting.config。複数可。チェックを付けたフォルダだけ)配下のファイル(Office ファイルとテキストファイル)を、シート・ページ・スライドなどの場所ごとにテキストを抽出して TSV に書き出し、フォルダ・拡張子ごとの本文インデックスにまとめて work/store/content/<インデックス名>/ に保存する(インデックスのファイルの形)。
| 種類 | 拡張子 | 抽出方法 | 場所(TSV の単位) |
|---|---|---|---|
| Excel | .xlsx .xlsm .xls .xlsb |
Excel の COM 操作でシートごとにテキスト保存(セルの表示値を得るため) | シート |
| Word | .docx .docm |
ファイル(ZIP 内の XML)を直接読む。Word は使わない | ページ(目安)・ヘッダー/フッター・脚注 |
| Word(旧形式) | .doc |
Word で .docx に変換してから、上と同じ方法で読む |
同上 |
| PowerPoint | .pptx .pptm |
ファイル(ZIP 内の XML)を直接読む。PowerPoint は使わない | スライド・ノート |
| PowerPoint(旧形式) | .ppt |
PowerPoint で .pptx に変換してから、上と同じ方法で読む |
同上 |
| テキスト | 対象の拡張子 | コピーを読む。Office は使わない | 行のまとまり(テキストファイル) |
.pdf |
コピーを PowerShell だけで読む。Office は使わない | ページ(PDF ファイル) |
インデックスを作る全てのファイル(Office ファイルもテキストファイルも)は、元のファイルを直接開かず、作業領域(既定は work/tmp/<PC の鍵>/<PID>。データの置き場所とパスの決め方)にコピーしてからコピーを開く・読む(copyFileShared)。メンテナの方針「元のファイルに絶対に影響を出さない」のため。コピーは元を読み取りだけ・共有モード(ReadWrite | Delete)で開いて行うので、効果として、インデックス作成中にほかの利用者が元のファイルを開いて編集・上書き保存でき、元のファイルを占有しない。書きかけの中身がコピーされうることは、直接読む場合と同じ。排他で開かれたファイルはコピーできず、取り込みの失敗になる。
コピーは 1 ファイルずつ、コピー → 読む(TSV を作る)→ コピーを消す、の順に進める。全部を先にコピーして置かない。取り込みのスレッド(ワーカー)は、1 ファイルを取り込む前に自分の作業フォルダを空にするので、作業領域に同時に置くコピーは、スレッドの数までになる。
- クロール対象フォルダは複数登録でき、チェックを付けたフォルダだけを取り込む。チェックを外したフォルダは取り込まないが、インデックスは残す。
- クロール対象フォルダ配下の全ファイルの更新日時・サイズ・状態を
work/store/ingest_status.tsvに記録し、前回から更新されたファイル・未取り込みのファイルだけを取り込む(差分取り込み)。 - 利用者に入力を求めない(コンソールで確認・キー入力を待たない)。画面から実行した場合(受け渡しの口の
ConfirmTargets)は、取り込み対象を数えたところでいったん止まり、インデックスごとの件数を画面に出して取り込むかどうかの返事を待つ(取り込み対象の決定)。前回失敗したファイルを再取り込みするかも、この確認で受け取る(コンソールから直接実行する場合は-RetryFailedで渡す)。 - 画面の[中止]で中止した場合、次回は未処理のファイルから再開する。インデクサが強制終了された(PC が停止した等)場合も同様で、強制終了したときに取り込んでいたファイルは最後に回す(取り込み一覧)。
- 1 ファイルの取り込みが制限時間(10 分)を超えたら、Office アプリを強制終了してそのファイルを「失敗」とし、次のファイルへ進む(応答しなくなったファイルで止まり続けないため。取り込み一覧)。
- 取り込みに失敗したファイルは取り込み一覧の状態を「失敗」とし、更新されない限り次回以降はスキップする(画面で「失敗分も再取り込みする」を選ぶと再取り込みする)。
- 元ファイルが無くなったファイルは、インデックス(本文インデックス)から外して取り込み一覧から除く。
- Excel・Word・PowerPoint は必要になったときだけ起動する(Word・PowerPoint は旧形式などの変換時のみ)。
- 1 ファイルの取り込みは、取り込みのワーカーで並べて行う。Excel・Word(
.doc)・PowerPoint(.ppt)は、それぞれスレッド 1 つが Office を 1 つ持つ。.docx・.pptxなどは、Office を使わない読み取りのスレッド(既定はコア数 − 1、最大 4。設定ingestThreads)で読む(取り込みの並列化)。
入出力¶
| 区分 | パス | 内容 |
|---|---|---|
| 入力 | setting.config の targetFolders |
クロール対象フォルダ(チェックの有無を含む。クロール対象フォルダ) |
| 入力 | クロール対象フォルダ配下の Office ファイル・テキストファイル・PDF ファイル | Office: .xlsx .xlsm .xls .xlsb .docx .docm .doc .pptx .pptm .ppt。テキスト: 対象の拡張子。PDF: .pdf(PDF ファイル) |
| 入出力 | work/store/ingest_status.tsv |
全ファイルの更新日時・サイズ・状態(取り込み一覧) |
| 入出力 | work/store/journal/ingest.tsv |
取り込みのジャーナル(仕事の始まり・フォルダの書き出しの追記ログ)。取り込み一覧を書き直し終えれば「終」で終わる(書き出せなかったフォルダは「出」が無いまま残り、次の回へ「未」で持ち越す)。「終」が無ければ、取り込み中に強制終了した(ジャーナルの形) |
| 入出力 | 受け渡しの口(メモリ上。newIndexerChannel) |
画面とのやり取り。進み具合(段階・処理済み・残り・失敗・いま行っていること)・取り込み予定(確認に出す件数)・確認の返事・中止の要求・続けられないエラー・終了コード(インデックス作成のメインフロー。画面とインデクサの受け渡し) |
| 出力 | work/indexing_log.txt |
表示内容の記録(writeIndexerLog。実行ごとに新しく書き、先頭に版と環境の見出しを書く。前回の分は work/indexing_log_previous.txt へ移す) |
| 作業領域 | work/tmp/<PC の鍵>/<PID>/(パスに [ ] を含む・長すぎて置けないときは、取り込みをすべてスキップする。どのファイルも中間 TSV などをこのフォルダに作るため、テキストファイルを含めすべて対象になる) |
取り込み途中のファイル(元のファイルのコピー・変換したファイル・TSV)。取り込みのスレッドごとに w<番号> に分ける。終了時に削除する |
| 作業領域 | work/publish/<PID>/ |
1 ファイル分の TSV を集めてからインデックスのフォルダと入れ替えるための場所(入れ替えと書き出し)。終了時に削除する |
| 出力 | work/store/content/<インデックス名>/<相対フォルダ>/content_index.<拡張子>.<番号>.tsv |
フォルダ・元のファイルの拡張子ごとの本文インデックス(インデックスのファイルの形)。インデックス名はクロール対象フォルダごと。取り込み中だけ、シート・ページ・スライドごとの TSV(<相対フォルダ>/<ファイル名>/*.tsv)を置く |
| 出力 | work/store/content/<インデックス名>/source_folder.txt |
インデックス名とクロール対象フォルダの対応(クロール対象フォルダと取り込み対象)。インデックスを別の PC・場所へコピーしても、検索結果から元のファイルを開けるようにする |