你如何利用全文索引在postgres中进行基于短语的全文搜索?

时间:2009-09-28 22:06:03

标签: postgresql full-text-search

假设您有一个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';

有没有办法在不必求助于搜索文本列的情况下执行此操作?

2 个答案:

答案 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)