ON article_search_index(
article_id
, (article_value::text) text_pattern_ops
);
И получаю следующую ошибку ERROR: index row requires 8504 bytes, maximum size is 8191 .Таблица по которой создаю индекс имеет следующий вид CREATE TABLE public.article_search_index (
id bigserial NOT NULL,
ticket_id int8 NOT NULL,
article_id int8 NOT NULL,
article_key varchar(200) NOT NULL,
article_value varchar NULL,
CONSTRAINT article_search_index_pkey PRIMARY KEY (id),
CONSTRAINT fk_article_search_index_article_id_id FOREIGN KEY (article_id) REFERENCES article(id),
CONSTRAINT fk_article_search_index_ticket_id_id FOREIGN KEY (ticket_id) REFERENCES ticket(id)
); Что делаю не так?
Ошибка вроде говорящая. Индекс слишком большой, т.к. в него включили строку.
Это понятно.Но я так понимаю надо article_value varchar NULL, надо ограничение включать по символам?
Ну, сделайте spgist индэкс для этого поля. Там по-моему не должно быть text_pattern_ops, но по идее такжэ для LIKE должны работать просто COLLATE "C" без указания opclass.
Впрочем, другой тожэ правильный путь -- подумать, сколько там реально первых символов будет достаточно для этого LIKE (100? 200?) -- и обрЕзать поле по этому количеству. И в индэксе и во всех запросах (функцыональный индэкс).
Обсуждают сегодня