web-dev-qa-db-ja.com

GINを使用してJSON列にインデックスを付ける

ドキュメントのとおり、テーブルのJSON列にインデックスを追加する必要があります。以下のようなクエリを実行しています。

CREATE INDEX idxgin ON api USING gin (jdoc);

次のエラーが発生します。

エラー:データ型jsonには、アクセス方法 "gin"のデフォルトの演算子クラスがありません
ヒント:インデックスの演算子クラスを指定するか、データ型のデフォルトの演算子クラスを定義する必要があります。

documentation のリンクは次のとおりです。

2
Munish Dhiman

GiN(一般化された逆インデックス)は逆インデックスであり、キーごとに1つのインデックスエントリのみを持ち、インデックスエントリに同じ値を持つすべてのキー行のマッピング情報(投稿リスト)を格納する構造です。 postgreSQLでは、キーはインデックスエントリに保存され、キーのマッピング情報は投稿ツリーに保存されます。索引エントリと投稿ツリーを検索するには、Bツリーを使用します。したがって、GINは、インデックスが行の多くの値(インデックス配列、ドキュメントなど)にマッピングする必要がある場合に役立ちます。

GINインデックスを作成する前に、あなたはいくつかの間違いをしていると思います。ここに見られるように postgresql GIN pg_trgm default operator class

GIN(一般化された逆索引)を作成するには、構文はそのようにする必要があります

CREATE INDEX name ON table USING gin(column);

GIN(Generalized Inverted Index)ベースのインデックスを作成します。列はtsvectorタイプでなければなりません。

デフォルトの演算子クラスjsonb_opsは、存在演算子(?、?&、? |)と包含演算子(@>)をサポートしています。また、jsonb_path_opsは包含演算子のみをサポートします。したがって、GINインデックスは、特定のキーまたはKey-Valueを持つもののみを検索できます。

JSONBの->>演算子を使用すると、PostgreSQLは操作の処理にBツリーまたはハッシュインデックスを使用できます。 ->> oeratorは、指定された属性の値をテキスト形式で返します。 PostgreSQLは、比較オペランドとしてテキスト結果のインデックスを使用できます。 GINインデックスは、GIN jsonb演算子クラスで使用できます。

Json演算子を表示するには ここ

詳細については ここ および ここ

6

JSONはjson検証済みのテキストタイプです。テキストにシリアル化されたJavaScriptオブジェクトです。インデックスを作成することはできません。索引付けできるのはデータのみです。そのテキストデータを作成するために、それを私たちが理解できる形式に移動します。

  1. テキストをJSONオブジェクトに変換します。
  2. インデックス可能なJavascriptプリミティブ(バイナリ)を使用してそのオブジェクトを格納します。

Jsonbでそのタイプ。 jdocをJSONからJSONBに変換し、

ALTER TABLE api
  ALTER COLUMN jdoc
  SET DATA TYPE jsonb USING jdoc::jsonb;

これで、上記の正確なクエリが機能します。

2
Evan Carroll

これも機能しているようです:CREATE INDEX idxgin ON api USING gin ((jdoc::jsonb));

0
K-Gun