Выбор X слов из текстового поля в MySQL

Я создаю базовую функцию поиска, используя LIKE (я бы использовал полнотекст, но в данный момент не могу), и мне интересно, может ли MySQL при поиске ключевого слова (например, поле WHERE LIKE '% word%' ) вернуть 20 слов с каждой стороны ключевого слова?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
3 646
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте функцию INSTR (), чтобы найти позицию слова в строке, а затем используйте функцию SUBSTRING (), чтобы выбрать часть символов до и после позиции.

Вам следует следить за тем, чтобы ваша инструкция SUBSTRING не использовала отрицательные значения, иначе вы получите странные результаты.

Попробуйте это и доложите.

Я не думаю, что можно ограничить количество возвращаемых слов, однако, чтобы ограничить количество возвращаемых символов, вы можете сделать что-то вроде

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
  • chars_before - количество символы, которые вы хотите выбрать перед ключевое слово (а)
  • total_chars - это общее количество символов, которое вы хотите Выбрать

т.е. следующий пример вернет 30 символов данных, начиная с 15 символов перед ключевым словом

SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30)

Примечание: как указал Арье, любые отрицательные значения в SUBSTRING () значительно усложняют ситуацию - например, если ключевое слово находится в первых [chars_before] символах поля, то последние [chars_before] символы данных в поле являются вернулся.

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

Я не могу сейчас это проверить, но регулярное выражение должно быть примерно таким:

.*(\w+)\s*WORD\s*(\w+).*

где вы заменяете WORD для искомого слова и используете группу регулярных выражений 1 как перед-слова и 2 как после-слова

Я протестирую его позже, когда я смогу спросить свой RegexBuddy, будет ли он работать :) и я выложу его здесь

Ответ принят как подходящий

Вы можете сделать все это в запросе с помощью SUBSTRING_INDEX

CONCAT_WS(
' ',
-- 20 words before
TRIM(
    SUBSTRING_INDEX(
        SUBSTRING(field, 1, INSTR(field, 'word') - 1 ),
        ' ',
        -20
    )
),
-- your word
'word',
-- 20 words after
TRIM(
    SUBSTRING_INDEX(
        SUBSTRING(field, INSTR(field, 'word') + LENGTH('word') ),
        ' ',
        20
    )
)

)

если мне нужно сопоставить несколько слов? что я должен делать?

davidlee 31.10.2015 09:07

Другие вопросы по теме