添付ファイルの本文を本体で抽出して検索する(改修案)
第1版作成 最終更新 (日本時間)
確認バージョン1.5.1.01.5.8.1
本体の標準機能ではありません
プリザンター本体には、添付ファイルからテキストを取り出す処理はありません。このページは、それを本体に組み込む場合の設計メモです。本体を改修せずに外部のワーカーで抽出する方法は 検索機能の内部実装 の「内部実装から導く検索の改善策」にあります。
前提にした現行実装
詳しくは 検索機能の内部実装 の「添付ファイルの中身の検索(SearchDocuments)」にまとめています。
Items.FullTextに入る添付ファイルの情報は、項目の「全文検索」の設定に応じてファイル名か GUID(または両方)だけです(FullTextExtensions.cs#L426-L458)。Search.jsonのSearchDocumentsをtrueにすると、検索条件にBinaries.Binへの条件がorで足されます。
| RDBMS | Binaries.Bin への条件 | 実質 |
|---|---|---|
| SQL Server | contains("Bin", @p)。Binaries に全文索引があり、IFilter が拡張子に応じて本文を取り出す | IFilter が入っている形式だけ検索できる |
| PostgreSQL | encode("Bin", 'escape') %> @p。Binaries に索引は無い | テキストファイルだけ。Office 文書・PDF は検索できない |
| MySQL | 0=1 | 検索できない |
- 添付ファイルの保存先がデータベース以外(
Local・LocalFolder・AzureBlob)だと、BinはNULLになり、SQL Server でも検索できません。
案の比較
| 観点 | 1. 本体で抽出して Items.FullText に載せる | 2. 外部の検索エンジン | 3. RDBMS の拡張 |
|---|---|---|---|
| 手間 | 中 | 大 | 中〜大 |
| RDBMS に依存しない | する | する | しない |
| 今の仕組みとのなじみ | 高い | 低い | 中 |
| 対応する形式の増やし方 | ライブラリを足す | エンジン側で多くの形式に対応 | RDBMS 次第 |
| 運用の手間 | 小 | 大 | 中 |
- 案 2 は 検索を外部の検索エンジンに外出しする にまとめています。権限を検索エンジン側でも持つ必要があり、改修は大きくなります。
- 案 3 は、PostgreSQL なら
pgroongaやpg_bigm、組み込みのtsvectorなどに変える方法ですが、Office 文書や PDF のバイナリからテキストを取り出す処理はどれにも無く、抽出は別に必要です。
既存の Items.FullText の索引をそのまま使え、保存先や RDBMS に関係なく動くので、案 1 が現実的です。
案 1 の設計
図を読み込み中…
候補のライブラリ
| ライブラリ | 形式 | ライセンス | 備考 |
|---|---|---|---|
| PdfPig | Apache 2.0 | PDF のテキスト抽出に特化 | |
| iText(itext7) | AGPL(商用は有償) | ||
| DocumentFormat.OpenXml | docx / xlsx / pptx | MIT | Microsoft の SDK |
| NPOI | doc / xls / ppt / docx など | Apache 2.0 | 古い Office 形式にも対応 |
| Apache Tika | 多数 | Apache 2.0 | Java。REST で呼ぶ |
PDF は PdfPig、Office 文書は Open XML SDK の組み合わせで主な形式をカバーできます。
改修箇所
| 箇所 | 内容 |
|---|---|
Binaries テーブル | 抽出テキストを入れる列を足す(カラム定義を追加して CodeDefiner で作る) |
添付ファイルの保存処理(Attachment / BinaryModel) | 保存時に抽出する。大きいファイルはバックグラウンドで抽出する |
FullTextExtensions.cs | 添付ファイル項目の FullText() で、抽出テキストも連結する |
Indexes.cs | 検索インデックスの再構築でも抽出テキストを連結する |
Search.json | 抽出の有効・無効、対象の拡張子、1 ファイルあたりの最大文字数を足す |
保存先がデータベース以外でも、抽出は保存の直前にメモリ上のデータで行えます。
注意点
| 論点 | 内容 |
|---|---|
| 保存時の負荷 | 抽出の分だけアップロードが遅くなる。大きいファイルや件数の多い一括登録はバックグラウンドに回す |
Items.FullText の大きさ | 1 レコード 1 文字列なので、1 ファイルあたりの文字数に上限を設ける |
| メモリ | 大きいファイルの抽出でメモリを使う。サイズの上限を設ける |
| 既存の添付ファイル | 改修前に保存したファイルは、抽出を一括で実行してから再構築する |
| ライブラリの保守 | 形式ごとにライブラリの更新を追う必要がある |