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

eal*_*ent 13 postgresql full-text-search

假设您有一个postgres 8.3表,如下所示:

CREATE TABLE t1 (body text, body_vector tsvector);

我希望能够使用全文索引(Give,GiN或tsvector列上的两者)搜索短语.我能找到的最好的解决方法是首先对两个单词进行全文搜索(布尔AND),然后在短语的主体上进行相似的比较.当然,这无法捕获postgres的全文搜索为您做的任何词干或拼写检查.这方面的一个例子是,如果我正在搜索短语'w1 w2',我会使用:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

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

Mag*_*der 12

如果你想要精确的词组匹配,那就是这样做的方法.您也可以尝试WHERE body_vector @@ plainto_tsquery('w1 w2'),然后按排名进行排序.(关键是单词彼此相邻的命中应该最终位于顶部)


Nei*_*gan 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)
Run Code Online (Sandbox Code Playgroud)

或者单词之间的距离:

-- 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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这些关于单引号的评论不再与编辑后的答案相关,这正确演示了在 9.6 中添加的短语 to_tsquery 的使用,以准确支持此用例。 (2认同)