Как создать индекс по полю JSON в Postgres?

111

В PostgreSQL 9.3 Beta 2 (?) Как мне создать индекс для поля JSON? Я попробовал это с помощью ->оператора, hstoreно получил следующую ошибку:

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

ОШИБКА: тип данных json не имеет класса оператора по умолчанию для метода доступа «btree». СОВЕТ: необходимо указать класс оператора для индекса или определить класс оператора по умолчанию для типа данных.

rlib
источник
8
"Где вопрос?" - В названии
rlib
2
В будущем, пожалуйста, загляните на stackoverflow.com/tags/postgresql/info , раздел «задавая лучшие вопросы»; это может помочь быстрее получить лучшие ответы с меньшим количеством надоедливых вопросов.
Craig Ringer

Ответы:

186

Нашел:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

Как указано в комментариях, тонкая разница здесь ->>вместо ->. Первый возвращает значение в виде текста, второй - как объект JSON.

rlib
источник
39
На всякий случай, если вы ищете разницу: она ->>вместо ->. Первый возвращает значение в виде текста, второй возвращает объект JSON.
Daniel Rikowski
35
Двойные круглые скобки также важны.
Рон
11
@Jac_opo Он извлекает их какTEXT бы. Если вы хотите сделать целые сравнения вместо сравнения строк, вы должны добавить бросок: ((info->>'name')::INT).
jpmc26 06
13
Если вы хотите создать индекс для поля внутри подобъекта вашего столбца JSON, благодаря @DanielRikowski я понял, что мне нужно сделать. create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Нам сначала нужно использовать, ->чтобы получить объект JSON, а затем ->>получить значение дочернего объекта как текст.
Кори Коул