Задавайте вопросы, мы ответим
Вы не зашли.
На сайте есть поиск по БД MySQL. До сих пор для выборки данных использовал запрос
SELECT text FROM news WHERE LIKE '% word1% word2%'
где word1 и word2 - слова запроса для поиска. Но при таком запросе он находит эти слова в произвольных местах текста, ибо % - любое количество любых символов.
Хотелось бы сделать так, чтобы слова word1 и word2 находились, скажем, в одном предложении. То есть между ними не должно быть точки, или не менее N символов.
Пробовал REGEXP '$word1.{1,10}$word2', REGEXP '$word1[^/.]$word2'. Либо не работает вообще, либо очень медленно.
Помогите пожалуйста правильно составить запрос.
Неактивен
Любой такой поиск — будет работать без использования индекса, а потому очень
медленно. Обычно для этих целей используют полнотекстовый индекс и соответствующие
запросы, но, к сожалению, этот индекс все равно отвечает на вопрос «слова находятся
в тексте», а не на вопрос «где находится данное слово».
Можете попробовать комбинировать полнотекстовый поиск и конкретное отсеивание
по регулярному выражению, как-то так:
Неактивен
Спасибо. Вот что получилось в результате:
$query = "SELECT title, text, code FROM $table WHERE sh='Y' AND ((text LIKE '%$word1%$word2%' AND text RLIKE '$word1.{2,10}$word2') OR (text LIKE '%$word2%$word1%' AND text RLIKE '$word2.{2,10}$word1') OR title LIKE '%$word1%$word2%' OR title LIKE '%$word2%$word1%')";
Наконец находится то, что надо.
Теперь пытаюсь сделать так, чтобы в результатах выводился нужный кусок текста, в котором подсвечиваются оба слова... Но это уже на PHP.
Неактивен
Если хотите работать без индексов, то можете половину проверок в IF выкинуть.
Если верно text rlike '$w1.{2,10}$w2', то text like '%$w1%$w2%' тоже верно всегда.
Неактивен
В принципе конструкцию 'text LIKE' можно вообще выкинуть, оставить только RLIKE, но тогда запрос выполняется гораздо дольше.
Не знаю, есть ли смысл использовать индексы. Повлияет ли это на производительность? Сейчас всё работает достаточно быстро, несмотря на большой объём базы.
Неактивен
Хм, я могу, конечно, придумать причину, почему обычный LIKE работает быстрее RLIKE, но,
кажется, эта штука вся упирается в процессор, а основное время база тратит все равно на
добывание данных.
Индекс — попробуйте на тестовых данных, может, понравится.
Неактивен