Упрощение полнотекстового поиска в PostgreSQL и цветовой запрос tsquery с псевдонимами - PullRequest
2 голосов
/ 08 июля 2011

Я пытаюсь упростить этот запрос, поскольку он будет генерироваться с помощью динмейка в PHP, и я хотел бы уменьшить накладные расходы на обработку (реальный запрос будет намного длиннее, но структура будет такой же!)

SELECT title, type_name, ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],
setweight(to_tsvector(coalesce(title,'')), 'A')
||
setweight(to_tsvector(coalesce(type_name,'')), 'B')
,
to_tsquery('search & query'))
FROM TestView WHERE
setweight(to_tsvector(coalesce(title,'')), 'D')
||
setweight(to_tsvector(coalesce(type_name,'')), 'B')
@@
to_tsquery('search & query');

Я пытаюсь уменьшить необходимость указывать tsquery и tsvector дважды, определяя что-то вроде псевдонима, чтобы его не нужно было указывать дважды. Примерно так (что не получается, я не уверен, что это даже близко к правильному!)

SELECT title, type_name, ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],
searchvector
,
searchquery
FROM TestView WHERE
setweight(to_tsvector(coalesce(title,'')), 'D')
||
setweight(to_tsvector(coalesce(type_name,'')), 'B') AS searchvector
@@
to_tsquery('search & query') AS searchquery;

Возможно ли это, или я просто застрял в генерации всего этого дважды.

Для контекста 'TestView' - это представление, сгенерированное из нескольких таблиц.

Любая помощь высоко ценится!

1 Ответ

1 голос
/ 08 июля 2011
SELECT title, 
       type_name,
       ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],weight,query)
FROM (
    SELECT title, 
           type_name, 
           setweight(to_tsvector(coalesce(title,'')), 'A')
              ||setweight(to_tsvector(coalesce(type_name,'')), 'B') as weight,
           to_tsquery('search & query') as query
    FROM TestView 
) t
WHERE weight @@ query
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...