2013-07-25 4 views
3

В базе данных postgres у нас есть таблица table1 и столбец столбца1, тип которого является текстом. И мы создали индекс для этого столбца CREATE INDEX idx_column1 ON table1 ИСПОЛЬЗОВАНИЕ gin (to_tsvector ('english', column1);postgresql полнотекстовый поиск функции синтаксиса

вопрос, почему, когда мы запустим этот запрос используется

SELECT * 
FROM table1 
where to_tsvector('english', column1) @@ to_tsquery('searchedText') 

индекс, но по этому показателю запроса не используется

SELECT * 
FROM table1 
where ts_match_vq(to_tsvector('english', column1),to_tsquery('searchedText')) 
+0

'ts_match_vq (to_tsvector ('english', column1) @@ to_tsquery ('searchText'))' Это не работает для меня. Функция определяется как ожидающая ts_vector и ts_query. В вашем примере вы передаете логическое значение, мой 9.1 жалуется на это. – DrColossos

+0

Извините, исправленный вопрос. Вместо ** ts_match_vq (to_tsvector ('english', column1) @@ to_tsquery ('searchText')) ** Мне нужно узнать о ** to_tsvector ('english', column1) @@ to_tsquery ('searchText') ** – zhmaksat

ответ

2

Wild догадка:

vector @@ query определяется как

CREATE OPERATOR @@(
    PROCEDURE = ts_match_vq, 
    LEFTARG = tsvector, 
    RIGHTARG = tsquery, 
    COMMUTATOR = @@, 
    RESTRICT = tsmatchsel, 
    JOIN = tsmatchjoinsel); 

Глядя на tsmatchjoinsel, происходит довольно много событий (не спрашивайте меня, что такое C вне меня ...) Но если вы переходите через разные функции, есть некоторые расчеты. При непосредственном использовании ts_match_vq вы обойдете эти вычисления. Вот почему ts_match_vq никогда не упоминается в документах, и вы всегда должны использовать @@, так как он заботится о том, чтобы называть правильные функции и все, что с ним связано.

Смежные вопросы