假设您有一个postgres 8.3表格如下:
CREATE TABLE t1 (body text, body_vector tsvector);
我希望能够使用全文索引(在tsvector列上的GiST,GiN或两者)搜索短语。我能找到的最好的解决方法是首先对两个单词进行全文搜索(布尔AND),然后在短语的主体上进行相似的比较。当然,这无法捕获postgres的全文搜索为您做的任何词干或拼写检查。这方面的一个例子是,如果我正在搜索短语'w1 w2',我会使用:
SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';
有没有办法在不必求助于搜索文本列的情况下执行此操作?
答案 0 :(得分:12)
如果您想要精确的词组匹配,那就是这样做的方法。您也可以尝试WHERE body_vector @@ plainto_tsquery('w1 w2'),然后按排名进行排序。 (关键是,单词彼此相邻的命中应该最终位于顶部)
答案 1 :(得分:7)
更新: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)