Подтвердить что ты не робот

Как вы выполняете полнотекстовый поиск на основе фраз в 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';

Есть ли способ сделать это, когда вам не нужно прибегать к поиску в текстовом столбце?

4b9b3361

Ответ 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)