词素在 tsvector 中的位置

Lexeme position in tsvector

我有以下几行文字:

"Blue pill"; "Red pill"; "Blue shift"; "Red eye".

我想要 select 行,其中 Red 是第一个单词或 Pill 是第二个单词。假设地,它可以通过使用 tsquerytsvector 来完成,因为 tsvector 的输出也包含每个词素的位置。但是我没有找到任何允许通过数字访问向量词素的函数。 是否有任何正确的方法 selecting 行,在定义的位置匹配 ts_query

可以用 tsvector 做到这一点:

with data as (
  select * from (
  VALUES (1, 'Blue pill'),
         (2, 'Red pill'),
         (3, 'Blue shift'),
         (4, 'Red eye')
  ) v(id, t)
)
select id, lexeme, positions
FROM data
CROSS JOIN unnest(to_tsvector(t)) u(lexeme, positions, weights)
WHERE (lexeme = 'red' and positions @> '{1}')
OR (lexeme = 'pill' and positions @> '{2}');
 id | lexeme | positions
----+--------+-----------
  1 | pill   | {2}
  2 | pill   | {2}
  2 | red    | {1}
  4 | red    | {1}
(4 rows)

不过,我认为使用正则表达式可能更容易做到这一点。