Apache Tika からの移行
Apache Tika は、DOCX・XLSX・PPTX および旧来の DOC・XLS・PPT を含む膨大な種類のファイルからテキストを抽出する、事実上の標準 JVM ライブラリです。パイプラインが Office ドキュメント専用 であれば、Office Oxide は最適な移行先です。同じ 6 形式に対応しつつ、JVM 不要・ネイティブ速度・シンプルなデプロイを実現します。
移行すべきタイミング
次のいずれかに該当する場合は切り替えを検討してください:
- 取り込みパイプラインが Office ドキュメントのみを対象としている(Tika が対応する PDF・EPUB・RTF・ODT などは不要)
- コンテナ / Lambda / デスクトップアプリに JVM を組み込んで調整したくない
- Java の JAR だけでなく、Python・Node.js・Go・C#・Rust のネイティブバインディングが必要
- ファイルごとのレイテンシが重要で、Tika の起動コストや JVM ウォームアップがショートリブのワーカーにとって問題になっている
- LLM・RAG パイプライン向けに構造化された Markdown / IR 出力が欲しい
Tika を使い続けるべき場面:
- Office Oxide がカバーしない多種多様なフォーマットを取り込む必要がある(Tika は約 1,400 種類のファイル形式に対応)
- すでに JVM 取り込みサービスがあり、ネイティブバインディングを追加するためのアーキテクチャ変更が割に合わない
- ロングテール全体にわたる Tika の MIME 検出機能に依存している
よくある折衷案:マイナーな形式は Tika に任せつつ、ほとんどの企業コーパスで件数が多い .docx / .xlsx / .pptx / .doc / .xls / .ppt に Office Oxide を採用する。
インストール
Python
pip install office-oxide
(tika または apache-tika の Python ラッパーと、それを動かしていた JVM を置き換えます。)
Rust
[dependencies]
office_oxide = "0.1.0"
Java
JVM を使い続ける場合は、C FFI と JNA / JNR-FFI 経由で Office Oxide を利用できます。あるいは office_oxide_cli を stdio 越しに呼び出すサイドカープロセスとして実行する方法もあります。同じエンジンを使いながら JVM ブリッジコードが不要です。
Python 比較チートシート
プレーンテキスト
Tika(REST モード)
import tika
from tika import parser
tika.initVM() # JVM startup; ~1-2s on first call
parsed = parser.from_file("report.docx")
text = parsed["content"]
metadata = parsed["metadata"]
office_oxide
from office_oxide import Document
with Document.open("report.docx") as doc:
text = doc.plain_text()
props = doc.as_docx().core_properties() # author, modified, etc.
JVM 起動なし、REST のラウンドトリップなし、ミリ秒未満の抽出速度。
バイト入力(一時ファイル不要)
Tika
import io, requests
from tika import parser
data = requests.get(url).content
parsed = parser.from_buffer(io.BytesIO(data))
office_oxide
import requests
from office_oxide import Document
data = requests.get(url).content
with Document.from_bytes(data, "docx") as doc:
print(doc.plain_text())
サーバー / バッチ処理
Tika — 通常は HTTP バックエンドとして tika-server モードで実行します。
java -jar tika-server.jar -h 0.0.0.0 -p 9998
import requests
text = requests.put("http://localhost:9998/tika",
data=open("report.docx", "rb"),
headers={"Accept": "text/plain"}).text
office_oxide — JVM もサーバーも不要で、ライブラリを直接呼び出すだけです。言語非依存のクライアントにサイドカーアーキテクチャが必要な場合は、MCP サーバー または stdio 経由の CLI を利用してください。
JVM ユーザー向け比較
Java・Kotlin・Scala のパイプラインで JVM を手放したくない場合:
- Office 以外のすべてには Tika を引き続き使用してください。
- Office 形式には
office-oxideを呼び出してください。2 つの選択肢があります:- JNA / JNR-FFI で
liboffice_oxideと C ヘッダーinclude/office_oxide_c/office_oxide.hを使う。Go や C# バインディングと共通の C API です。 ProcessBuilder経由でoffice_oxide_cliサイドカーを起動する。stdin で入力を流し、stdout で出力を受け取る。再起動が簡単で、クラッシュを隔離できます。
- JNA / JNR-FFI で
どちらも Office 形式において Tika より高速で、JVM on JVM の奇妙な挙動も回避できます。
Tika との機能比較
| Tika | Office Oxide | |
|---|---|---|
| DOCX, XLSX, PPTX | ✓ | ✓ |
| Legacy DOC, XLS, PPT | ✓ | ✓ |
| PDF, EPUB, RTF, ODT, etc. | ✓ | ✗(PDF は pdf_oxide を使用) |
| プレーンテキスト抽出 | ✓ | ✓ |
| Markdown 出力 | 部分的 | ✓(組み込み to_markdown) |
| 構造化 IR / JSON | XHTML SAX イベント | ✓(型付き DocumentIR) |
| 検索・置換テンプレート | ✗ | ✓(EditableDocument) |
| セル書き込み(XLSX) | ✗ | ✓(set_cell) |
| 旧形式 → 新形式変換 | ✗ | ✓(save_as) |
| JVM 必要 | ✓ | ✗ |
| ネイティブ速度 | JVM オーバーヘッド | ファイルあたり 1ms 未満 |
パフォーマンス(Office 形式のみ)
DOCX・XLSX・PPTX・DOC・XLS・PPT が混在する 100 万件の Office 取り込みを tika-server と比較した結果:
| パイプライン | 処理時間 | 備考 |
|---|---|---|
| tika-server(REST)、8 ワーカー | ~3 h 40 m | HTTP オーバーヘッド含む |
| tika-app(インプロセス JVM)、8 ワーカー | ~1 h 50 m | Tika のベストケース |
| office_oxide、8 ワーカー | ~3 m | ネイティブ解析 |
フォーマットの構成比によって数値は変わりますが、取り込みが多い Office ワークロードでは通常 30〜60 倍の差が出ます。
関連ドキュメント
- パフォーマンスベンチマーク — フォーマット別の詳細数値
- RAG 向け Office — Tika 置き換えの RAG パターン
- MCP サーバー — クロス言語パイプライン向けサイドカー