Как вы выполняете полнотекстовый поиск на основе фраз в postgres, который использует полнотекстовый индекс?
Скажем, у вас есть таблица postgres 8.3 следующим образом:
CREATE TABLE t1 (body text, body_vector tsvector);
Я хочу, чтобы иметь возможность искать его для фраз, используя полный текстовый индекс (GiST, GiN или оба в столбце tsvector). Лучшее обходное решение, которое я смог найти, - это сначала выполнить полный текстовый поиск по обоим словам (логический И), а затем выполнить аналогичное сравнение в теле для этой фразы. Конечно, это не позволяет зафиксировать какие-либо проверки или проверки орфографии, что для вас полнотекстовый поиск postgres. Например, если я ищу фразу 'w1 w2', я бы использовал:
SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';
Есть ли способ сделать это, когда вам не нужно прибегать к поиску в текстовом столбце?
Ответы
Ответ 1
Если вам нужно точное совпадение фразы, это способ сделать это. Вы также можете попробовать WHERE body_vector @@plainto_tsquery ('w1 w2'), а затем заказать его по рейтингу. (точка в том, что попадания, где слова находятся рядом друг с другом, должны заканчиваться сверху)
Ответ 2
Обновление: текстовый поиск PostgreSQL 9.6 поддерживает фразы
select
*
from (values
('i heart new york'),
('i hate york new')
) docs(body)
where
to_tsvector(body) @@ phraseto_tsquery('new york')
(1 row retrieved)
или расстоянием между словами:
-- a distance of exactly 2 "hops" between "quick" and "fox"
select
*
from (values
('the quick brown fox'),
('quick brown cute fox')
) docs(body)
where
to_tsvector(body) @@ to_tsquery('quick <2> fox')
(1 row retrieved)