PostgreSQL 10 - возвращает значение части столбца (TEXT) с соответствующим шаблоном ILIKE и его N соседними словами - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь добиться чего-то похожего на то, что делает поиск Google при отображении результата, поэтому под заголовком и URL-адресом мы получили краткий предварительный просмотр текста с соответствующими словами из строки поиска.

Текстпример данных:

Обычно, если вы правильно настроили все отношения между моделями и объектами таблицы отражения, вам нужно будет работать только со связанными моделями (добавляя объекты моделей вотношение InstrumentList) для вставки данных в таблицы отражений.

Ввод пользователя:

отношение

Результат:

Обычно, если вы правильно настроили отношения между моделями

На данный момент я пришел к следующей (очень плохой) реализации:

SELECT id,
    COALESCE(
        (regexp_match(text, '(?i)\s.*?(relation.*?\s(\w+\s+){3})'))[1]
      , (regexp_match(text, '(?i)((\w+\s+){3}relation.*?)\s'))[1]
    ) AS text
FROM drafts.draft
WHERE
    text ILIKE '%relation%';

Я действительно плохо разбираюсь в регулярных выражениях, поэтому он показывает только следующие слова (не предыдущие), и если мы изменим 3 на 8 для данного текста выше, он возвращает не 8 слов, а больше (я думаю, что этоиспользование запятой в тексте).Кроме того, он возвращает NULL, если до конца текста осталось менее N слов.


Резюме:

Учитывая текст произвольной длины, мы хотим установить параметры match, N, где match - наша подстрока, а Nколичество слов, которое мы хотим иметь с каждой стороны (до и после) первой совпавшей фразы в тексте.

1 Ответ

0 голосов
/ 30 декабря 2018

Вы можете использовать substring() для извлечения на основе шаблона.Похоже, это делает то, что вы хотите:

select substring(str from '((\w+\W){0,3}[\w]*relation[\w]*(\W[\w]+){0,3})')
from (values ('Normally if you have all the relationship setup properly between models and reflection table objects, you will only need to deal with related models (by appending model objects into the relationship InstrumentList) in order to insert data into reflection tables.')) v(str)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...