Индекс PostgreSQL GIN на массиве uuid

Я хотел бы использовать индекс джина на uuid[] (чтобы иметь эффективные тесты членства для массивов UUID). Однако, когда я пытаюсь это PostgreSQL дает мне ошибку:

mydb=> CREATE TABLE foo (val uuid[]);
CREATE TABLE
mydb=> CREATE INDEX foo_idx ON foo USING GIN(val);
ERROR:  data type uuid[] has no default operator class for access method "gin"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

как я могу добавить необходимый класс оператора, чтобы он работал?

отметим, что этой похожий вопрос для типа citext но предоставленный ответ не работает.

2 ответов


Это можно сделать с помощью следующего оператора:

CREATE OPERATOR CLASS _uuid_ops DEFAULT 
  FOR TYPE _uuid USING gin AS 
  OPERATOR 1 &&(anyarray, anyarray), 
  OPERATOR 2 @>(anyarray, anyarray), 
  OPERATOR 3 <@(anyarray, anyarray), 
  OPERATOR 4 =(anyarray, anyarray), 
  FUNCTION 1 uuid_cmp(uuid, uuid), 
  FUNCTION 2 ginarrayextract(anyarray, internal, internal), 
  FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal), 
  FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal), 
  STORAGE uuid;

кредиты этой за то, что указал мне в правильном направлении.

соответствующие документы в сопряжение расширений с индексами, в частности, там описаны стратегия оператора и номера функций для Джина.


начиная с PostgreSQL 10 пользовательский класс оператора _uuid_ops больше не нужно, так как теперь есть общий встроенный opclass array_ops on anyarry (см.: https://www.postgresql.org/docs/current/static/gin-builtin-opclasses.html)