词素在 tsvector 中的位置
Lexeme position in tsvector
我有以下几行文字:
"Blue pill";
"Red pill";
"Blue shift";
"Red eye"
.
我想要 select 行,其中 Red
是第一个单词或 Pill
是第二个单词。假设地,它可以通过使用 tsquery
和 tsvector
来完成,因为 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)
不过,我认为使用正则表达式可能更容易做到这一点。
我有以下几行文字:
"Blue pill";
"Red pill";
"Blue shift";
"Red eye"
.
我想要 select 行,其中 Red
是第一个单词或 Pill
是第二个单词。假设地,它可以通过使用 tsquery
和 tsvector
来完成,因为 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)
不过,我认为使用正则表达式可能更容易做到这一点。