Postgresql

使用 GIN 索引 JSON 列

  • October 24, 2021

我需要根據文件在表中的 JSON 列上添加索引,我正在執行類似於下面的查詢。

CREATE INDEX idxgin ON api USING gin (jdoc);

我收到以下錯誤:

錯誤:數據類型 json 沒有訪問方法“gin”的預設運算符類

提示:您必須為索引指定運算符類或為數據類型定義預設運算符類。

這是文件的連結。

GiN(Generalized Inverted Index)是反向索引,一種結構,每個鍵只有一個索引條目,並將所有鍵行的映射資訊(發布列表)儲存在索引條目中具有相同的值。在 postgreSQL 中,鍵儲存在索引條目中,鍵的映射資訊儲存在發布樹中。為了搜尋索引條目和發布樹,使用了 B-Tree。因此,當索引必須在一行上映射許多值時,GIN 很有用,例如索引數組、文件。

我想在創建 GIN 索引之前,您犯了一些錯誤。正如你在這裡看到的PostgreSQL GIN pg_trgm 預設操作符類

要創建 GIN(廣義反向索引),語法應該類似於

CREATE INDEX name ON table USING gin(column);

創建基於 GIN(廣義反向索引)的索引。該列必須是 tsvector 類型。

預設操作符類 jsonb_ops 支持存在操作符(?、?&、?|)和包含操作符(@>)。而 jsonb_path_ops 只支持包含操作符。因此 GIN 索引只能搜尋特定的鍵或鍵值。

當我們使用 JSONB 的 ->> 運算符時,PostgreSQL 可以使用 B-tree 或 Hash 索引來處理操作。->> 運算符以文本格式返回指定屬性的值。PostgreSQL 可以將文本結果的索引用作比較操作數。GIN jsonb 操作符類可以使用 GIN 索引。

在這裡查看 json 運算符

如需進一步參考HereHere

JSON 是經過 json 驗證的文本類型:序列化為文本的 Javascript 對象。你不能有用地索引它。您只能索引數據。為了製作該文本數據,我們將其轉換為有意義的格式。

  1. 將文本轉換為 JSON 對象。
  2. 使用可索引的 Javascript 原語(二進制)儲存該對象。

jsonb 中的那種類型。所以jdoc從 JSON 轉換為 JSONB,

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

現在您上面的確切查詢將起作用。

引用自:https://dba.stackexchange.com/questions/174411