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






Используйте функцию INSTR (), чтобы найти позицию слова в строке, а затем используйте функцию SUBSTRING (), чтобы выбрать часть символов до и после позиции.
Вам следует следить за тем, чтобы ваша инструкция SUBSTRING не использовала отрицательные значения, иначе вы получите странные результаты.
Попробуйте это и доложите.
Я не думаю, что можно ограничить количество возвращаемых слов, однако, чтобы ограничить количество возвращаемых символов, вы можете сделать что-то вроде
SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
т.е. следующий пример вернет 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
)
)
)
если мне нужно сопоставить несколько слов? что я должен делать?