大量の書類を複雑な条件で検索する基盤としてOpenSearch Serverlessを利用
株式会社LayerX / TAK848
メンバー / バックエンドエンジニア
| 利用機能 | ツールの利用開始時期 | 事業形態 |
|---|---|---|
OpenSearch Serverless | 2025年7月 | B to B |
| 利用機能 | OpenSearch Serverless |
|---|---|
| ツールの利用開始時期 | 2025年7月 |
| 事業形態 | B to B |
アーキテクチャ
アーキテクチャの意図・工夫
ハイブリッド構成の採用
- Amazon OpenSearch Serverless: filterクエリによる高速な絞り込みと、ID取得に特化。
- Amazon Aurora Serverless v2 (MySQL): OpenSearchから得たIDで正確な最新データを取得、Single Source of Truthとする。
イベント駆動アーキテクチャへの一本化
- すべてのインデックス更新を、Amazon EventBridge → Amazon SQS → Backend Serviceによる非同期イベント経由に統一
- 10秒検索結果が遅延するため、同期で無理に更新する必要が無い
- DynamoDBによるテナント単位の分散ロックで競合を完全に回避
Serverless制約への対応
- 10秒の
refresh_interval: アラート表示、自動更新ボタンなどUI/UXで工夫 max_result_window制限: Point In Time (PIT) APIで一括処理に対応、ページネーション制限を加える代わりに逆順ソートをサポート- スケーリング遅延による429エラー: exponential backoffと、SQSによるリトライ機構を構築
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
バクラク請求書発行では、帳票の一覧検索を完全にSQLのSELECT queryのみで実装しており、以下の課題を抱えていました。
- お客様の書類ごとの独自の項目(カスタム項目)による検索ができない
- 検索パフォーマンスの著しい低下: 25個以上に渡る様々な検索項目と、テナントごとに異なる複雑な検索条件により、インデックスなどによるチューニングを行った上のRDBのオプティマイザでも対処できない複雑なクエリが発行され、最大数十秒かかるケースが発生
- 将来的なスケーラビリティの懸念: 書類件数は日々増加するため、今後年数が経過するにつれてさらなる性能悪化が確実に起こる
お客様が独自に定義した項目であるカスタム項目は、DBのカラムでは一般にシリアライズドLOBと呼ばれるJSON形式で保存されていたため、検索が実質的に不可能でした。特に、案件番号やプロジェクト名等の項目で書類を検索したいという要望は非常に多く、導入における必須条件となっていることもありました。
どのような状態を目指していたか
- カスタム項目を含む柔軟な検索条件でも、常に高速な検索を実現
- 書類件数が増加しても安定したパフォーマンスを維持できる
- 運用負荷を最小限に抑えた自動スケーリングが行われる
- MySQLはあくまでSingle Source of Truthとして保ち続ける
比較検討したサービス
- Aurora Serverless v2(MySQL)のみで全ての検索を実装
- Amazon OpenSearch Serverless
- Amazon OpenSearch Managed Cluster
比較した軸
- 導入・運用の容易性: アプリケーションチームでメンテナンスするため、スケーリングやシャード管理など、出来る限り細かい管理を委譲したかった
- 既存の検索条件を互換性を崩さず維持できる
- 複雑な検索条件でも高速応答できる検索性能
- カスタム項目も柔軟に検索できる対応
選定理由
- filterクエリによる高速検索: スコア計算不要で、SQL WHEREに近い純粋なフィルタリングが可能。これにより、既存条件もほとんどは問題なく移行できた
- Serverlessの運用メリット: シャード管理・スケーリングが自動化され、運用負荷が最小限
- 全体方針との一致: 全文検索エンジンはOpenSearch Serverlessを活用するという方針が既にあった
- nestedデータ型のサポート: カスタム項目の複雑な検索条件に対応可能
導入の成果
改善したかった課題はどれくらい解決されたか
- カスタム項目による検索: 完全に実現
- 検索パフォーマンス: p99が数十秒 → 1秒未満に劇的改善。中央値・p90・p99といった指標全てのパフォーマンスが向上。
- スケーラビリティ: 書類件数増加にも対応可能な基盤を確立
どのような成果が得られたか
- 検索速度が劇的に改善し、中央値・平均値を含む全体的なパフォーマンスが向上
- カスタム項目検索対応によって喜びの声が届いた
- 今後検索項目が増えたり、書類件数が増えても耐えうる検索環境となった
導入時の苦労・悩み
- データ構造の見直し: 基本的にデータ同期に当たってはOpenSearchにスナップショットを登録する必要がある。一つのデータが編集されると理論上無限の書類の情報に影響する項目があり、既存の検索条件を同等に維持できないものがあったため、書類に紐付く送付先のラベルのスナップショット化などをあらかじめ行う必要があった
- refresh_intervalの最小値が10秒: 書類作成・更新後の検索結果への反映が多少気になるレベルで遅延する。UI/UXでのフォローと、実際に表示するデータはMySQLから取得し直すことで、あくまで表示データは正しいという状況を作った。
- インデックス更新の競合問題: 同じ書類に対するMySQLからOpenSearchへのデータ登録リクエストが競合することで、片方で更新したかった項目が更新されないことが希に発生した。DynamoDBによるインデックス処理系へのロック取得によって解決した。
- 429エラーの散発的発生: OpenSearch Serverlessのスケーリング完了までの一時的なキャパシティ不足により、全件インデックス時や、急に負荷が上がったときなどにエラーが出た。リトライ機構により解決した。
- max_result_windowの10,000件固定: ページネーション制限が発生する。逆順検索のサポートで代替しつつ、全ページに対する一括処理ではPoint In Time APIによって対応した。
導入に向けた社内への説明
上長・チームへの説明
- カスタム項目検索は最も要望の多い機能であり、ビジネス価値が明確
- 書類件数が多くかつ複雑な条件による検索は、検証用の環境でも遅いことが確認されており、事業成長に伴ってお客様の体験がより悪化することが明確
- Serverlessによる自動スケーリング・シャード管理で、インフラ運用工数を大きく削減できる
活用方法
よく使う機能
OpenSearchで言うと以下です。
- filterクエリ: スコア計算なしの高速フィルタリング
- nestedデータ型: カスタム項目の複雑な検索条件に対応
- Point In Time (PIT) API: 検索条件に一致する書類全てに一括処理をするときに使用
- track_total_hits: 10,000件以上の検索結果件数カウント
Serverless特有のもので言うと、シャード管理といった細かい管理の委譲はもちろん,BtoBでサービス利用時間帯は偏りがあるため、スケーリングが自動で行われていて助けられています。
ツールの良い点
- filterクエリによる圧倒的な検索速度
- インデックスなどによる細かいチューニング無しでも安定したパフォーマンスが出る
- Serverlessによる自動スケーリング、シャード管理不要による運用負荷の軽減
- nestedデータ型でJSONデータの複雑な検索が可能
- Amazon EventBridge、Amazon SQS、Amazon DynamoDBとシームレスに連携
ツールの課題点
refresh_intervalが10秒固定で反映遅延は回避不可: UI/UX工夫で対応max_result_windowが10,000件固定で変更不可: PIT APIやソート条件拡張で回避- Managed Clusterと比べて設定の自由度が低い
- スケーリングの遅延により一時的な429エラーが散発的に発生する。Aurora Serverless系等のスケーリングより大分遅め。
ツールを検討されている方へ
- 複雑な条件による検索を提供しているサービスがスケールしてきて、検索時間がボトルネックになっているような環境でまずおすすめ。
refresh_interval10秒、max_result_window10,000件といった制約を事前に把握し問題が無いかを確認する必要がある。絶対に10秒の遅延が許容されないような環境では使用できない。ただし、検索結果に一致する総件数はtrack_total_hitsによって取得できる。
- より細かい制御が必要な場合は、Managed Clusterも選択肢に入れる
この記事では触れていませんが、OpenSearchはこれだけでなくベクトル検索など様々な検索方法がサポートされており、近年流行のRAG(Retrieval-Augmented Generation)などとも相性は良いはずです。ただし、OpenSearch Serverlessを使う場合、Serverlessという特性上、ローカルでホストするOpenSearchでは使用できても実際には一部機能が塞がれていたり、特有の制約が存在することもあるので、事前に確認しておくことをお勧めします。
今後の展望
お客様の体験向上のため、以下の対応が出来れば良いなと思っています。
- 書類の楽観的表示による即時反映感の向上
- 最新書類表示箇所でのSQL混在によるハイブリッド検索の強化
- ServerlessからManaged Clusterへの移行検討(今後あまりにも遅延やスケーリング遅延が問題になった場合)
- さらなるUI/UX改善による10秒遅延の影響最小化
株式会社LayerX / TAK848
メンバー / バックエンドエンジニア
よく見られているレビュー
株式会社LayerX / TAK848
メンバー / バックエンドエンジニア
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法


