очень мало примеров.
Я хочу сделать свой тип вида:
create type int_ev as (
e int[],
v int[]
);
И хочу индексировать его с помощью GIN.
Но поле e содержит метаданные и в поиске участвовать не должно.
Т.е. мой тип - это обертка над массивом в поле v, и я хочу чтобы по нему можно было искать и индексировать его как массив.
И были бы доступны операторы
int_ev && int[], int_ev <@ int[], int_ev @> int[], int_ev == int[]
Есть пример того, как реализовать что-то подобное?
Нужно писать сишные функции? или будет достаточно pl/pgsql?
Вы лучше не гуглите, а почитайте документацию. > Есть пример того, как реализовать что-то подобное? Поищите в исходниках PostgreSQL (возможно, в contrib). Хотя именно такого, как Вы хотите, я там сходу не помню... > Нужно писать сишные функции? Скорее всего, да (но это не точно).
спасибо, и еще такой момент я пролистал документацию и не понял, чтобы gin индекс работал для моего типа, мне нужно реализовать какие операторы? https://www.postgresql.org/docs/current/gin-builtin-opclasses.html тут где 4 оператора реализовано, где 2, а где вообще 6
Те четыре, которые Вам нужны, по идее: int_ev && int[], int_ev <@ int[], int_ev @> int[], int_ev == int[] А вот для индексирования нужно реализовать вот это: https://www.postgresql.org/docs/current/gin-extensibility.html Кстати, зачем Вы всё это делаете? Не легче было бы как-то извернуться с функциональными индексами и т.п.? ;)
по поводу операторов, да мне нужно эти 4, а вопрос в общем, вот есть тип и я хочу его индексировать gin, как понять, я вообще смогу это сдлать, т.е. какие номера операторов нужно реализовать. Например, если я реализовал второй оператор, то должен ли я реализовать первый? Номер оператора - это число, что указывается при объявлении op class. а в моем случае, да, функциональный индекс должен сработать. Кстати, можете объяснить, почему он так странно задается? create index i on t using gin( v(f) ); а не create index i on t using gin( (f).v ); при этом Index "public.i" Column | Type | Key? | Definition --------+---------+------+------------ v | integer | yes | ((f).v) gin, for table "public.t"
По первому вопросу я сходу не помню (но это было описано в документации, я практически уверен), извините. > Кстати, можете объяснить, почему он так странно задается? > а не create index i on t using gin( (f).v ); Потому что мало скобок. ;) CREATE INDEX ON t USING gin( ((f).v) ); А первая запись — это functional notation для композитных типов, см. https://www.postgresql.org/docs/current/rowtypes.html#ROWTYPES-USAGE
Обсуждают сегодня