Fessで必要なクロールだけスキャンPDFをOCRにかける

Fessの15.10向け開発ブランチで、クロール設定ごとにOCRを有効にした場合、スキャンPDFにも同じ指定が適用されるよう修正されました。OCRが必要なフォルダーだけを対象にし、ほかのクロールの負荷を抑えたい場合に役立ちます。

全体を無効のまま、対象のクロールだけ指定する

全体設定の初期値はcrawler.document.ocr.enabled=false、言語はeng、タイムアウトは120秒です。これまで画像やOffice文書内の画像では個別設定が働いても、本文を持たないPDFは全体設定が無効だとOCRされませんでした。今回、Tesseractが利用できればPDFの処理時にも個別設定を確認します。

対象クロールの「設定パラメーター」に次を指定します。

config.tika.tesseract.config=tesseract.properties

値はファイルシステムの絶対パスではなく、クラスパス上のリソース名です。ZIP版はapp/WEB-INF/classes/、RPM/DEB版は/etc/fess/にファイルを用意します。日本語と英語なら、内容を次のようにします。

language=jpn+eng
preserveInterwordSpacing=true
timeoutMillis=300000

クローラープロセスからPATH経由で実行できるTesseract本体と、指定言語のデータが必要です。導入後はクローラーを再起動して設定を反映し、代表的な画像とスキャンPDFで確認してください。文字入りPDFは従来どおりPDFBoxで抽出し、その本文が空の場合にOCRへ引き継ぎます。すべてのPDFをOCRし直す修正ではありません。

個別ファイルは全体設定とマージされない

ファイルに省略した値は全体設定を引き継がず、Tikaの初期値になります。languageはeng、timeoutMillisは120000、preserveInterwordSpacingはfalseです。言語は明示し、日本語ではpreserveInterwordSpacing=trueも指定します。省くと「請 求 書」のように文字間に空白が入り、「請求書」で検索できない場合があります。

timeoutMillis=300000は300秒です。全体設定のcrawler.document.ocr.timeoutは秒なので単位を区別します。旧timeoutSecondsは互換変換されますが、警告を確認して新しいキーへ移行します。tesseractPath、tessdataPath、imageMagickPathをこのファイルに書いても効果はありません。

全体が無効で個別ファイルもなければOCRは実行されません。逆に全体が有効な環境で特定クロールだけ止めたい場合は、その個別ファイルにskipOcr=trueを指定します。全体設定が有効かどうかを示す起動時のOCRログは、個別設定の実行有無を表すものではありません。

既存文書とクロール条件を確認する

OCRにはCPU時間がかかるため、対象や同時実行数を絞って確認します。Webクロールでは画像URLが初期状態で除外されるので、画像を対象にする場合は除外URLの設定も確認します。

既にインデックスされた文書は設定を変えるだけでは書き換わりません。「最終更新日時の確認」によって変更のない文書が省略される場合は、一時的にその確認を無効にするなど、対象文書の取得と本文抽出が再実行される条件でクロールしてください。

PRではTesseract 5.5.2を使ったファイル・Webクロールで、全体無効と個別有効の組み合わせでもスキャンPDFを認識すること、skipOcr=trueで実行しないことを確認しています。認識精度と所要時間は資料によるため、実際の帳票やスキャン画像で評価が必要です。

関連PR

Fess 15.10向けTika 4移行で見直す抽出・OCR設定

Fessの15.10向け開発ブランチに、Apache Tika 4.1.0への移行がマージされました。文書から本文やメタデータを取り出す仕組みの更新に伴い、独自の抽出設定やOCR設定を使っている環境では、移行前の確認が必要です。

tika.xmlの設定を引き継げない

15.10向けの実装では、Tikaのパーサーをコードで構築し、tika.xmlを読み込みません。配布構成からもこのファイルを取り除いています。従来のファイルが設定ディレクトリに残っていると、起動時にfess.logへ警告を出します。

特に、parser-excludeで特定のパーサーを除外していた環境は確認が必要です。ファイルを残しても除外設定は効かず、従来止めていたパーサーが動く可能性があります。既存の設定を控え、移行後に同じ運用条件を満たせるか検証してから、不要になったファイルを整理してください。

従来の主な配置場所はZIP版のapp/WEB-INF/conf/tika.xml、RPM/DEB版の/etc/fess/tika.xmlです。既存の正式版を運用している段階で、この説明だけを根拠に削除する必要はありません。

Docker側の対応はfess/snapshotとfess/snapshot-slimで、削除されるファイルを/etc/fessへ移動しようとしてビルドが失敗することを防ぎます。リリース済み15.x用Dockerfileは今回の修正対象に含まれません。

OCRの秒とミリ秒を区別する

Fess全体のOCR設定は次の初期値を維持します。

crawler.document.ocr.enabled=false
crawler.document.ocr.language=eng
crawler.document.ocr.timeout=120

OCRは初期状態で無効、言語は英語、タイムアウトは120秒です。有効にする場合は、クローラープロセスの環境にTesseract本体と必要な言語データを用意します。tesseractと、利用する場合のImageMagickは、そのプロセスのPATHから見つかる必要があります。

一方、クロール設定のconfig.tika.tesseract.configで指定するTesseract用プロパティファイルでは、タイムアウトのキーがtimeoutMillisになり、単位はミリ秒です。たとえば300秒なら次のように記述します。

language=jpn
timeoutMillis=300000

旧キーtimeoutSecondsは値を1000倍して互換変換し、fess-crawler.logへ警告を出します。両方ある場合はtimeoutMillisが優先されます。Fess全体のcrawler.document.ocr.timeoutは引き続き秒なので、単位を混同しないようにします。クロール設定ごとのファイルは全体設定より優先されます。

tesseractPath、tessdataPath、imageMagickPathをこのファイルに書いても効果がありません。また、config.tika.pdf.configで指定するPDF用ファイルでは、ocrStrategyやocrDPI、ocrImageTypeなど、Tika 4で削除されたプロパティは警告付きで無視されます。適用できない指定を残したままにせず、ログを確認してください。PDF設定のextractIncrementalUpdateInfoはFess側で初期値をfalseにしています。

既存のPDFBoxによる本文抽出からTikaへの引き継ぎ条件を含め、代表的なスキャンPDFと文字入りPDFで再確認してください。PRのOCR検証は仮のtesseractによるもので、実際のTesseractによる文字認識品質や所要時間までは確認されていません。

メタデータ名と抽出結果を確認する

Tika 4では多くのメタデータ名が変わります。互換フィルターが対応する名前はTika 3の名前へ戻しますが、すべての名前を戻すわけではありません。たとえばExcelのprotectedはmsoffice:excel:protected-worksheetになります。crawler.metadata.name.mappingやスクリプトで使うキーは、実際の抽出結果と照合してください。

Tika内部用のtk:、X-TIKA:、zip:で始まるメタデータは、文書へ渡す前に除去します。これらをマッピングやスクリプトで取得することはできません。crawler.metadata.content.excludesの新しい初期値は次のとおりです。

crawler.metadata.content.excludes=resourceName,X-Parsed-By,Content-Encoding.*,Content-Type.*,X-TIKA.*,tk:.*,X-FESS.*

古い設定ファイルにtk:.*がなくても内部情報を本文に混ぜない処理があります。一方、それ以外の新しいメタデータは除外条件に一致しなければ本文へ追加されるため、独自の除外条件も見直します。

文字コードの報告名も、Shift_JISがwindows-31j、EUC-JPがx-eucJP-Openになるなどの違いがあります。ローカルファイルのContent-Lengthが実サイズになる点や、Markdownの解析も含め、既存文書で検索内容や連携処理に影響がないか確認するとよいでしょう。

移行前に用意するもの

独自のtika.xml、Tesseract/PDF用プロパティファイル、メタデータのマッピング設定を控え、代表的な文書の抽出結果を比較できるようにしておきます。対応版へ切り替えた検証環境では、設定警告、本文、メタデータ、OCR処理を確認します。既存インデックスの本文は自動で書き換わらないため、必要な文書は本文抽出が再実行される形でクロールしてください。

fess-crawlerの抽出クラスを利用する独自プラグインでは、TikaExtractor.setTikaConfigの削除やExtractDataのインターフェース変更もあるため、15.10向けの再ビルドと互換性確認が必要です。

関連PR

FessのSharePointクロールで除外設定と空白入りURLを確認する

FessのSharePointデータストアで、除外した文書ライブラリーが検索対象に残る問題と、名前に空白があるリストなどを検索結果から開くと404になる問題の修正がマージされました。利用中のクロール設定を見直すときに、確認したい点をまとめます。

除外したライブラリーがリストとして取り込まれる問題

SharePointの文書ライブラリーは、フォルダー一覧だけでなくリスト一覧にも現れます。従来はsite.exclude_folderでフォルダーとしてのクロールを止めても、同じライブラリーをリスト側から処理してしまう場合がありました。Shared Documentsを除外した場合も、予備の探索経路で再び対象になる問題がありました。

修正後は、列挙された最上位フォルダーを除外対象も含めて覚えておき、リスト側からの重複取り込みを防ぎます。

たとえば、既存のデータストア設定のパラメーター欄に、対象ライブラリー名に合わせて次を指定します。

site.exclude_folder=Library2

この設定の初期値は未指定で、利用者が追加する除外条件はありません。組み込みの除外対象は別にあります。値は最上位フォルダーのタイトルに対する正規表現で、複数指定はカンマ区切りです。完全一致を意図するなら、^Library2$のように明示できます。正規表現の記号を含む名前は適切にエスケープしてください。

適用されるのはサイト全体をクロールする場合です。site.list_id、site.list_name、site.doclib_pathで単一リストや文書ライブラリーを指定するモードの除外設定にはなりません。修正対象も、フォルダー一覧に現れるライブラリーの再取り込みであり、すべてのリストを名前で除外する新機能ではありません。

設定を保存して修正を含むプラグインでクロールした後は、除外対象の文書が検索結果に残っていないか確認します。この修正だけで既存インデックスの文書が即時削除されるわけではないため、古い文書の削除処理が実行される設定と範囲も確認してください。クロール除外はSharePoint側のアクセス権設定の代わりにはなりません。

名前に空白があるリストを開けない問題

検索対象のURLに空白があると、検索結果から移動する際に空白が+へ変わり、別のパスとして扱われる場合がありました。たとえば次のURLです。

修正前: /sites/site1/Lists/Blank+list/DispForm.aspx?ID=2
修正後: /sites/site1/Lists/Blank%20list/DispForm.aspx?ID=2

15.9.x向けのSharePointプラグインでは、表示フォームURLの空白を%20として登録します。リスト項目、ライブラリーファイル、項目の添付ファイルが共有する処理の修正で、追加の有効化設定はありません。空白のないURLや、文字としての+は変えません。

空白入りURLは登録される値が変わるため、文書IDも変わります。次回クロールで新しい文書として取り込まれ、旧URLの文書は古い文書の削除工程で片付ける必要があります。更新直後は、新旧文書の重複とリンク先を確認してください。

15.10向けの開発ブランチでは、Fess本体のリダイレクト時のエンコードを修正しています。こちらはパスマッピングのfunction:encodeUrlにも適用されます。15.9.xのプラグインで登録URLを変える対応とは適用箇所が異なるため、利用するFessとプラグインの系列をそろえて確認してください。

関連PR