Postgres: Как я могу включить веса в созданный столбец?

#postgresql #weighted #tsvector #generated-columns

Вопрос:

У меня есть следующая схема:

 CREATE TABLE books (
  title VARCHAR(255),
  subtitle TEXT
);
 

Добавление сгенерированного столбца без весов работает нормально:

 ALTER TABLE books ADD COLUMN full_text_search TSVECTOR
  GENERATED ALWAYS AS (to_tsvector('english',
    coalesce(title, '') ||' '||
    coalesce(subtitle, '')
  )) STORED; -- ✅ Working
 

Теперь я хочу добавить веса, и это не работает:

 ALTER TABLE books ADD COLUMN full_text_search_weighted TSVECTOR
  GENERATED ALWAYS AS (to_tsvector('english',
    setweight(coalesce(title, ''), 'A') ||' '||
    setweight(coalesce(subtitle, ''), 'B')
  )) STORED; -- ❌ Not working
 

Есть ли способ включить веса с сгенерированным столбцом в postgres?

Ссылка на Воспроизведение: https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/1385

Ответ №1:

Прочитав документы, я узнал, что setweight это возвращается tsvector . Мне пришлось изменить его следующим образом:

 ALTER TABLE books ADD COLUMN full_text_search_weighted TSVECTOR
  GENERATED ALWAYS AS (
    setweight(to_tsvector('english', coalesce(title, '')), 'A') ||' '||
    setweight(to_tsvector('english', coalesce(subtitle, '')), 'B')
  ) STORED; -- ✅ Working
 

Теперь мы можем заказать результат со следующим запросом:

 SELECT ts_rank(full_text_search_weighted , plainto_tsquery('english', 'book')), title, subtitle
  FROM "books"
  WHERE full_text_search_weighted @@ plainto_tsquery('english', 'book')
  ORDER BY ts_rank(full_text_search_weighted , plainto_tsquery('english', 'book')) DESC;
 

Ссылка на воспроизведение: https://www.db-fiddle.com/f/sffBR96NJtWej9c1Pcfg2H/0