Skip to content

添付ファイルの本文を本体で抽出して検索する(改修案) ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.1.01.5.8.1

本体の標準機能ではありません

プリザンター本体には、添付ファイルからテキストを取り出す処理はありません。このページは、それを本体に組み込む場合の設計メモです。本体を改修せずに外部のワーカーで抽出する方法は 検索機能の内部実装 の「内部実装から導く検索の改善策」にあります。

前提にした現行実装 ​

詳しくは 検索機能の内部実装 の「添付ファイルの中身の検索(SearchDocuments)」にまとめています。

  • Items.FullText に入る添付ファイルの情報は、項目の「全文検索」の設定に応じてファイル名か GUID(または両方)だけです(FullTextExtensions.cs#L426-L458)。
  • Search.json の SearchDocuments を true にすると、検索条件に Binaries.Bin への条件が or で足されます。
RDBMSBinaries.Bin への条件実質
SQL Servercontains("Bin", @p)。Binaries に全文索引があり、IFilter が拡張子に応じて本文を取り出すIFilter が入っている形式だけ検索できる
PostgreSQLencode("Bin", 'escape') %> @p。Binaries に索引は無いテキストファイルだけ。Office 文書・PDF は検索できない
MySQL0=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 の設計 ​

図を読み込み中…

候補のライブラリ ​

ライブラリ形式ライセンス備考
PdfPigPDFApache 2.0PDF のテキスト抽出に特化
iText(itext7)PDFAGPL(商用は有償)
DocumentFormat.OpenXmldocx / xlsx / pptxMITMicrosoft の SDK
NPOIdoc / xls / ppt / docx などApache 2.0古い Office 形式にも対応
Apache Tika多数Apache 2.0Java。REST で呼ぶ

PDF は PdfPig、Office 文書は Open XML SDK の組み合わせで主な形式をカバーできます。

改修箇所 ​

箇所内容
Binaries テーブル抽出テキストを入れる列を足す(カラム定義を追加して CodeDefiner で作る)
添付ファイルの保存処理(Attachment / BinaryModel)保存時に抽出する。大きいファイルはバックグラウンドで抽出する
FullTextExtensions.cs添付ファイル項目の FullText() で、抽出テキストも連結する
Indexes.cs検索インデックスの再構築でも抽出テキストを連結する
Search.json抽出の有効・無効、対象の拡張子、1 ファイルあたりの最大文字数を足す

保存先がデータベース以外でも、抽出は保存の直前にメモリ上のデータで行えます。

注意点 ​

論点内容
保存時の負荷抽出の分だけアップロードが遅くなる。大きいファイルや件数の多い一括登録はバックグラウンドに回す
Items.FullText の大きさ1 レコード 1 文字列なので、1 ファイルあたりの文字数に上限を設ける
メモリ大きいファイルの抽出でメモリを使う。サイズの上限を設ける
既存の添付ファイル改修前に保存したファイルは、抽出を一括で実行してから再構築する
ライブラリの保守形式ごとにライブラリの更新を追う必要がある

関連ページ ​

変更履歴

第1版セッションの仕組みとデータベースのテーブル構成の解説を追加し、性能とスケールアウトの説明を修正