Я пытаюсь добиться чего-то похожего на то, что делает поиск 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
количество слов, которое мы хотим иметь с каждой стороны (до и после) первой совпавшей фразы в тексте.