MarkLogic Data Hub バイナリデータの取り込みについて
※本記事の内容は、Data Hub v5.2.1を前提としています。
今回のエントリでは、MarkLogic Data HubにおけるIngestion Step(読み込みステップ)を用いて、PDFなどのバイナリデータを読み込む場合の注意点および、バイナリデータに対する検索を実現するための方法について説明します。 既にMarkLogic Data Hubの概要および、フローやステップに関する基礎知識をお持ちの方を読者対象としておりますので、これからMarkLogic Data Hubについて学ばれるという方は、下記のドキュメントやチュートリアルを先にご参照ください。
・Data Hub QuickStart チュートリアルhttps://www.progress.com/jp/blogs/data-hub-quickstart-tutorial
・MarkLogic Data Hubドキュメンテーション日本語版: https://developer.marklogic.com/learn/data-hub-quickstart-jp/ 英語版(最新): https://docs.marklogic.com/datahub/
バイナリデータの取り込み
Ingestion Stepの設定項目であるSource Format, Target Format をBinaryに変更することによって、画像やPDF、オフィス文書などのバイナリデータについても、MarkLogicにそのまま取り込むことが可能です。
本エントリでは、下記のMarkLogic インストレーションガイド(日本語版)のPDFファイルをサンプルデータとして利用しますので、手順を実施したい方はデータハブのプロジェクトからファイルを参照できるようにしておいてください。https://docs.marklogic.com/guide/installation-jp.pdf
はじめに新規のフローを作成します。作成したフローに、Ingest Stepを1つ追加します。
Ingest Stepに対する設定項目の中で、上記のサンプルPDFファイルを含んだディレクトリをSource Directory Pathに指定します。 また、Ingest Step内のSource Formatと、Target FormatをそれぞれBinaryに変更します。
設定完了後、”RUN”ボタンをクリックして、フローを実行します。ステータスが、Finished に変化したことを確認します。
読み込み後のバイナリデータの確認
Browse Data から、STAGINGデータベースを確認します。ステップ名と同一のコレクション名で絞り込むと、下記のようにサンプルデータであるPDFファイルが格納されていることが確認できます。 一方で、CSVやJSONなどを読む込んだ場合とは異なり、スニペットは表示されておらず、クリックしても内部のテキストやコンテンツは表示されません。
続いて、クエリコンソールからも確認を行います。クエリコンソールにアクセスを行い、cts.wordQueryクエリをSTAGING データベースに対して発行します。 インストレーションガイドですので、“インストール”は頻出単語となっていますが、クエリにマッチするドキュメントは存在しないという結果になります。
このようにバイナリデータの場合、単にMarkLogicにデータを読み込んだだけでは、内部のテキストやメタデータに関するインデックスは作成されず、全文検索を行うことが出来ません。 テキスト等の内部コンテンツに対する検索要件が存在する場合、テキストやメタデータの抽出が必要となります。 これらの要件を実現するためには、MarkLogicが提供するAPIを利用するか、外部のソリューションと組み合わせる必要があります。 なお、外部のソリューションを用いる場合は、抽出したメタデータをMarkLogic内に戻してあげる必要があります。
MarkLogicはバイナリデータのメタデータ抽出を行うための仕組みをいくつか提供しています。今回のエントリでは代表例として、Document Filter APIについてご紹介します。 ※Document Filterの利用にあたっては、MarkLogic Converterのインストールが事前に必要です。
Document Filter APIを利用することにより、対応フォーマットのファイルであれば、バイナリデータのURIを引数に渡すことにより、テキストやメタデータをXHTML形式で抽出することが可能です。 試しに、STAGINGデータベースに読み込まれたサンプルデータのPDFファイルに対して、Document Filterを適用してみます。
すると、PDF内のメタデータや内部テキストがXHTMLの形式で返ってくることが確認できます。 (注:スクリーンショットは、一部分のみのキャプチャとなっていますがスクロールダウンすると、PDF全体に渡って変換されていることが確認できます)
この結果をMarkLogic内で保存することにより、バイナリデータそのものに含まれるテキスト等についても、クエリ対象にすることが可能です。実装方式は要件によって異なってきますが、今回はシンプルにCustom Stepを追加し、その中でDocument Filterの処理を追加する場合についてご紹介します。
Document Filter処理の追加
Custom Stepを追加し、自動生成されるmain.sjs ファイルを編集していきます。
標準では下記のディレクトリに、main.sjsファイルが作成されます。/データハブディレクトリ/src/main/ml-modules/root/custom-modules/custom/ステップ名/main.sjs
main.sjsの変更箇所は主に下記の3点となります。
- envelope作成処理の前に、instanceをDocument Filterの出力結果で置換しておく
let filteredDoc = xdmp.documentFilter(doc); instance = filteredDoc; |
- オリジナルデータのURIとは異なるURIを設定 (例: 接尾語として、.xhtmlを付与するなど)
//メタデータ保持用のURI定義 newContent.uri = id + “.xhtml”; |
- メタデータとオリジナルデータの両方をFINALデータベースに書き出し
//デフォルトではnewContentのみ、配列にすることでFINALデータベースへの複数ファイル書き出しも可能 return [newContent, content]; |
- と 3.は任意ですが、これらを行わない場合はDocument Filterの出力(.xhtml)のみがFINALデータベースに書き込まれる形となりますので、FINALデータベースには元のバイナリデータは書き込みは行われません。
main.sjsモジュールの編集・再デプロイ後、”RUN”ボタンをクリックして、再度フローを実行します。FINALデータベースを確認し、バイナリデータとDocument Filterを利用して抽出されたデータ(.xhtml)の両方が書き込まれていることを確認します。Document Filterの出力を含むデータの場合、テキストの中身が確認できる状態になっていることがわかります。
更にクエリコンソールからcts.wordQueryクエリをFINALデータベースに対して発行すると、下記のように結果が返ってくることが確認できます。
今回はバイナリデータを取り扱う場合の注意点および、Document Filter APIを活用したテキストおよびメタデータ抽出の方法についてご紹介しました。 MarkLogicではDocument Filter以外にも、より高度な抽出設定が可能なxdmp.pdfConvertやxdmp.wordConvertといったAPIも存在しておりますので、ご興味のある方は是非試してみてください。
野田孝一
前職では、システム連携領域を中心としたミドルウェアソリューションのプリセールスエンジニアを経験。
その後、MarkLogicが持つ可能性に魅力を感じ、2017年に東京オフィス入社。
現在は、MarkLogicの価値を国内の様々なお客様にお伝えするべく、日々の案件活動を技術面から支える活動をしています。