SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.08.2009 23:48:20

AnWeb
Участник
Зарегистрирован: 10.08.2009
Сообщений: 3

Помогите составить запрос для поиска

На сайте есть поиск по БД MySQL. До сих пор для выборки данных использовал запрос

SELECT text FROM news WHERE LIKE '% word1% word2%'

где word1 и word2 - слова запроса для поиска. Но при таком запросе он находит эти слова в произвольных местах текста, ибо % - любое количество любых символов.

Хотелось бы сделать так, чтобы слова word1 и word2 находились, скажем, в одном предложении. То есть между ними не должно быть точки, или не менее N символов.

Пробовал REGEXP '$word1.{1,10}$word2', REGEXP '$word1[^/.]$word2'. Либо не работает вообще, либо очень медленно.

Помогите пожалуйста правильно составить запрос.

Неактивен

 

#2 11.08.2009 05:24:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить запрос для поиска

Любой такой поиск — будет работать без использования индекса, а потому очень
медленно. Обычно для этих целей используют полнотекстовый индекс и соответствующие
запросы, но, к сожалению, этот индекс все равно отвечает на вопрос «слова находятся
в тексте», а не на вопрос «где находится данное слово».

Можете попробовать комбинировать полнотекстовый поиск и конкретное отсеивание
по регулярному выражению, как-то так:

SELECT *
FROM tablename
WHERE MATCH(field) AGAINST ('+word1 +word2') IN BOOLEAN MODE
AND field RLIKE 'word1.{1,10}word2';


В случае, когда таких слов индекс выдаст не очень много, это будет работать.

Неактивен

 

#3 12.08.2009 14:59:43

AnWeb
Участник
Зарегистрирован: 10.08.2009
Сообщений: 3

Re: Помогите составить запрос для поиска

Спасибо. Вот что получилось в результате:

$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.

Неактивен

 

#4 12.08.2009 16:40:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить запрос для поиска

Если хотите работать без индексов, то можете половину проверок в IF выкинуть.
Если верно text rlike '$w1.{2,10}$w2', то text like '%$w1%$w2%' тоже верно всегда.

Неактивен

 

#5 12.08.2009 19:32:45

AnWeb
Участник
Зарегистрирован: 10.08.2009
Сообщений: 3

Re: Помогите составить запрос для поиска

В принципе конструкцию 'text LIKE' можно вообще выкинуть, оставить только RLIKE, но тогда запрос выполняется гораздо дольше.

Не знаю, есть ли смысл использовать индексы. Повлияет ли это на производительность? Сейчас всё работает достаточно быстро, несмотря на большой объём базы.

Неактивен

 

#6 13.08.2009 13:13:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить запрос для поиска

Хм, я могу, конечно, придумать причину, почему обычный LIKE работает быстрее RLIKE, но,
кажется, эта штука вся упирается в процессор, а основное время база тратит все равно на
добывание данных.

Индекс — попробуйте на тестовых данных, может, понравится.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson