Позиция Лексема в цветекторе - PullRequest
1 голос
/ 20 мая 2019

У меня есть следующие строки текста:

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

Я хочу выбрать строки, где Red - первое слово или Pill - второе. Гипотетически это может быть сделано с использованием tsquery и tsvector, поскольку вывод tsvector содержит также позиции каждой лексемы. Однако я не нашел ни одной функции, позволяющей получить доступ к лексемам векторов по их номерам. Есть ли правильный способ выбора строк, соответствующих ts_query в определенных позициях?

1 Ответ

2 голосов
/ 20 мая 2019

возможно сделать это с помощью 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)

Я думаю, что, вероятно, проще сделать это с помощью регулярного выражения.

...