
2026/01/12 5:54
Elasticsearch は決してデータベースではありませんでした。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
供給された要約は、必要な情報をすべて明確かつ簡潔に捉えているため、修正の必要はありません。
本文
James Blackwood‑Sewell(2025年9月18日)
Elasticsearchは決してデータベースではありません。Apache Lucene 上に構築された検索エンジン API として設計され、非常に強力な全文検索ライブラリを利用していますが、レコード管理システムとしては意図されていません。Elastic 自身のガイドラインも長らく「真実(source of truth)は別所に置き、Elasticsearch は二次インデックスとして活用すべきだ」と示唆していました。それにも関わらず、過去10年で多くのチームが検索エンジンを主要なデータベースとして使おうと試み、予想外の結果に直面しています。
「データベース」とは何か?
ここで言う データベース は、OLTP 取引処理用に主たるストレージとして利用できるシステムです。アプリケーションが真実を保持する場所と考えてください。PostgreSQL(3 年連続「最愛データベース」投票)や MySQL、あるいは Oracle などが典型例です。
なぜこのような状況に至ったのか?
物語は検索という単純なニーズから始まります。チームは既に Postgres や MySQL を使ってアプリケーションデータを保管していますが、組み込みテキスト検索機能がスケールしません。Elasticsearch は高速で柔軟、立ち上げも簡単なため完璧な解決策のように見えます。
最初はインデックスだけです。ドキュメントはデータベースに保存され、検索用に Elastic にコピーが作られます。時間とともに境界線が曖昧になり、もしドキュメントがすでに Elasticsearch にあるならば、なぜデータベースにも書き込む必要があるのか?という疑問が生まれます。二つのストアを同期させるプロセスは最も脆弱であり、その負荷を削減するために「もう書き込み不要」と考えられるようになります。すると検索インデックス自体がデータベースとなり、レコード管理システムは静かに移行します。
ここから問題が始まります。データベースとは単に JSON やテキストドキュメントとメタデータを保管する場所ではありません。それは権威ある真実の源であり、アプリケーションデータを安全に保持する仲裁者です。この役割には原子性トランザクション、一貫した更新、安全なスキーマ進化、検索以外の質問が可能なリッチクエリ、および障害時の信頼性という期待が伴います。Elasticsearch はインデックスとしては優秀ですが、データベースとしては脆弱です。
そもそも存在しなかったトランザクション
最初の亀裂は一貫性に関わるものです。リレーショナルデータベースではトランザクションが関連する書き込みを同時成功または失敗へ保証します。注文を挿入し、在庫を減らす操作は原子であり、両方が完了するか全く行われないかです。
Elasticsearch は単一ドキュメント以上の保証を提供できません。書き込みは独立して成功し、順序外に起こる可能性があります。ロジカルなグループから1つだけ失敗すると、半分の操作しか適用されず、チームは再試行や照合ジョブでギャップを埋めようとしますが、これが Elasticsearch をデータベースとして機能させなくなる瞬間です。レコード管理システムは時間とともに不整合を許してはいけません。
読み取り側でも同様の問題があります。Elasticsearch には GET(IDによる取得)と SEARCH の2種類の読み取りがあり、GET は常に最新の確認済みバージョンを返します(一方で障害時にダーティリードが発生することも)。一方 SEARCH は Lucene セグメントのみを参照し、非同期で更新されます。したがって最近確認された書き込みは次回のリフレッシュまで表示されません。
データベースはトランザクション境界とアイソレーションレベルでこれらの問題を解決しますが、Elasticsearch にはそれがありません。検索エンジンとして効果的に機能するために不要なものです。
インデックス再作成を伴うスキーマ移行
アプリケーションが変更されるとき――整数フィールドが小数を受け入れるようになる、あるいはテキストフィールドの名前が変わる――Postgres や MySQL では
ALTER TABLE で簡単に処理できます。Elasticsearch ではインデックスマッピングは一度設定すると不変です。最善策は更新されたマッピングを持つ新しいインデックスを作成し、すべてのドキュメントを移行することです。
Elasticsearch が別のデータベースの下流にある場合は痛みが少なく(完全なネットワーク転送ですが安全)、真実のソースから再生できます。しかし Elasticsearch が唯一のストアであれば、スキーママイグレーションはレコード管理システム全体を新しい構造へ移動させる作業になり、ロード中に行うとリスクが高まります。定期的なスキーマ変更が大きな障害操作になる可能性があります。
ジョインのないクエリ
Elasticsearch が主要ストアになると、開発者は検索以上のことを求めます――データに質問したいです。この点で別の壁が現れます。JSON ベースの Query DSL は全文検索や集計には強力ですが、関係ワークロードには限界があります。Elastic の言葉でも「複雑な検索・フィルタリング・集計を可能にする」と述べられていますが、それ以上に進むと亀裂が顕在化します。レコード管理システムから期待される基本的なジョイン機能は欠如しているか、部分的にしかサポートされていません。
以下の SQL クエリを考えてみましょう:
-- 50件以上レビューがある製品の平均評価で上位10商品 SELECT p.id, p.name, AVG(r.rating) AS avg_rating FROM products p JOIN reviews r ON r.product_id = p.id GROUP BY p.id, p.name HAVING COUNT(r.id) >= 50 ORDER BY avg_rating DESC LIMIT 10;
PostgreSQL では日常的です。Elasticsearch では選択肢が面倒です:レビューを各製品ドキュメントにデノーマライズ(新しいレビューごとに製品を書き直す)、子として埋め込む、あるいは両方のインデックスを別々にクエリし、アプリケーションコードで結果を組み合わせる。
Elastic はこのギャップを解消しようとしています。最近登場した ES|QL にはルックアップジョインがあり、Elastic SQL もより馴染みやすい構文(ジョインなし)を提供します。しかしこれらはまだ Lucene のインデックスモデルに縛られています。その上で開発者は Query DSL, ES|QL, SQL, EQL, KQL といった重複したクエリシンタックスの混乱に直面しています。進歩はあるものの、リレーショナルデータベースとの完全な対等には至っていません。
信頼性の不足
すべてのシステムは最終的に失敗します。インデックスとデータベースの違いは回復方法です。データベースは書き込み前ログ(WAL)やリドゥログを使用し、トランザクションがコミットされた時点ですべての変更が永続化され、クラッシュ後に安全に再生できることを保証します。
Elasticsearch も通常運用中は個々のドキュメント書き込みレベルで耐久性があります。トランログはプライマリシャード上で確認済みドキュメントを
fsynced し、クラッシュから回復可能です。しかし、先述したようにトランザクション境界がないため、関連する書き込みが同時に失敗または成功する保証はありません。障害により半分しか適用されない操作が残り、データベースのようにロールバックできません。
インデックスとしては問題なくても、唯一のストアであればトランザクション耐久性の欠如は正確性のギャップとなります。障害は単なる検索遅延を引き起こすだけでなく、レコード管理システム自体が危険にさらされます。
運用上の負荷
Elasticsearch を大規模に運用すると別の現実が浮かび上がります。データベースは安定した基盤を提供するよう設計されています:稼働、監視、信頼性を確保します。一方 Elasticsearch は「弾力性」を重視しており、シャード移動、クラスタ拡張・縮小、再インデックス化やリバランスが可能です。これらの柔軟性は強力ですが、分散システムならではの運用トレードオフがあります。シャードの不均衡、JVM ヒープのチューニング、再インデックス時のクラスタ容量消費、ローリングアップグレードの遅延などが課題です。
Elastic はこれらを緩和するツールを追加していますが、基盤となる期待は異なります。リレーショナルデータベースは真実のソースであることを前提に安定性と正確性を設計します。Elasticsearch は「速度と関連性」に最適化されており、レコード管理システムとして運用する場合はデータベースが課すよりも高い運用リスクを受け入れることになります。
誤用のコスト
Elasticsearch の操作自体が複雑でリソース集約的です。主要データベースとして利用しようとすると、両方の最適化目標が衝突します。トランザクションギャップ、脆弱なマイグレーション、限定的なクエリ、複雑な運用、回避策―すべてが重なり合い、複雑性を減らすどころか、最も壊れやすい場所に集中させます。結果は元の解決策より悪化し、真実のソースとして期待される保証は得られません。
まとめ:Elasticsearch はどうあるべきか?
正直言えば、Elasticsearch はそれが始まったとおりの場所にあります ― 検索エンジンです。Elastic と Apache Lucene は驚異的な成果を上げ、世界中の開発者にトップクラスの検索機能を提供しています。「レコード管理システム」として使う試みは、想定された設計から逸脱し、多くの場合より大きなコストとリスクを招きます。
正しく「使用」する場合でも、最も難しい部分は検索そのものではなく、ETL パイプラインや同期ジョブ、インジェスト層が最も脆弱になる点です。ここで ParadeDB が登場します。ParadeDB を主要データベースとして運用すれば OLTP と全文検索を一つのシステムで統合でき、既存 Postgres を利用しながら ETL を排除して論理的フォロワーとして展開できます。
正確性、単純さ、そして世界クラスのパフォーマンスを備えたオープンソース検索を求めるなら、ParadeDB で始めてみましょう。