投稿日:2026/7/12
更新日:2026/7/12

RDB と OpenSearch では「インデックス」という同じ言葉が別物を指す。混乱しがちなので整理したメモ。
関連: OpenSearchとActiveRecordの利用用途の違い(検索フロー全体)、
searchkickのレイヤー構造とOpenSearchからActiveRecordへの境界(Rails での実装の内側)
RDB の「テーブルに付けるインデックス」とは別物。
OpenSearch の「インデックス」は RDB でいう「テーブル」に近い概念で、
ドキュメント(JSON)が丸ごと入った独立したデータの入れ物。
MySQL のインデックス(B-tree など)を操作しているわけではない。
| RDB のインデックス | OpenSearch のインデックス | |
|---|---|---|
| 何者か | テーブルに付ける検索補助データ(B-tree など) | テーブルそのものに相当するデータの入れ物 |
| 例えると | 本の巻末の索引 | 本そのもの(索引が最初から織り込まれた本) |
| 単体で存在できる? | できない(元テーブルの付属品) | できる(独立したデータストア) |
MySQL: users テーブル + そこに付けた index
OpenSearch: users インデックス = ユーザーJSONの集合体そのもの
(テーブル相当。MySQLとは別サーバーの別データ)
MySQL で ADD INDEX するあの「インデックス」を想像すると混乱するので注意。
「インデックス」以外もまとめて対応づけると混同しにくい。
| RDB | OpenSearch |
|---|---|
| テーブル (Table) | インデックス (Index) |
| レコード / 行 (Row) | ドキュメント (Document / JSON) |
| カラム / 列 (Column) | フィールド (Field) |
| (テーブルに付ける)インデックス | 転置インデックスなどの内部構造(下記4章) |
つまり「RDB のインデックスを操作している」のではなく、
「RDB とは別の場所にある、検索専用のデータ置き場を読み書きしている」が正確。
OpenSearch は内部で全フィールドを転置インデックス
(「この単語を含むのはドキュメント3と7」という逆引き表)などの
検索最適構造で保持しているため。
「全カラムに最初から索引が張られた状態でしか存在しないテーブル」
—— だから入れ物自体を「インデックス」と呼ぶ
と捉えると腑に落ちる。
対象は RDB の付属品ではなく、独立した検索用データストアそのもの。