Как запросить в тексте последовательность слов, но не обязательно одно за другим сразу в Postgres - PullRequest
0 голосов
/ 23 октября 2019

Есть ли способ выполнить полнотекстовый поиск последовательности слов? Порядок важен, но расстояние между словами нет. Слова могут быть рядом друг с другом или на расстоянии n -слов друг от друга.

Например, с учетом следующего текста: The quick brown fox jumps over the lazy dog.

Следующие поиски должны вернуть true:quick brown, quick jumps, jumps dog.

Но должно возвращаться следующее false: brown quick, jumps fox, jumps brown.

Оператор <->вернет true, только если два слова точно одно за другим. <n> (где n> 0) вернет истину, только если второе слово точно на расстоянии n от первого слова.

Решение, которое приходит мне в голову, состоит в использовании & оператор, а затем выполнить дополнительную фильтрацию, используя LIKE '%firstword%secondword%', но это медленно, если имеется много документов (и в таблице будет более 100 000+ документов).

Есть ли в Postgres быстрый способ сделать это?

1 Ответ

1 голос
/ 23 октября 2019

Здесь можно использовать регулярные выражения:

WITH yourTable AS (
    SELECT 'The quick brown fox jumps over the lazy dog'::text AS input
)

SELECT input
FROM yourTable
WHERE input ~* '.*\yquick\y.*\yjumps\y.*';

Демо

Регулярное выражение, используемое здесь, для обнаружения quick иjumps как отдельные слова на входе, в этом точном порядке:

.*\bquick\b.*\bjumps\b.*
...