| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > Помогите написать нормальный запрос для поиска |
| Автор: Borland_Delphi_6 3.2.2006, 18:52 | ||
Уже замучался с попытками сделать нормальный поисковик для своего сайта. В оригинале используется такой запрос:
Но он выдает какие-то совершенно дикие результаты, что поиском назвать ну никак нельзя. Например, по запросу "Рома" выдает страницу со словом "романтика" ну и т.д. Если же убрать "%", то не выдает почти ничего. Возможно, кто-то уже пытался реализовать более "интеллектуальный" поиск и будет не жалко поделится? Ну или хоть советы какие-то дайте чтоли... Стоит ли применять "полнотекстовый" поиск, если таблица не очень большая? Какие это даст преимущества/недостатки? |
| Автор: AntonioBanderaz 4.2.2006, 02:41 | ||
Поищи доки про полнотекстовой поиск
|
| Автор: -=Ustas=- 4.2.2006, 06:30 |
| Или LIKE заюзай. http://dev.mysql.com/doc/refman/4.1/en/string-comparison-functions.html http://dev.mysql.com/doc/refman/4.1/en/fulltext-search.html |
| Автор: Borland_Delphi_6 4.2.2006, 16:24 |
| AntonioBanderaz Я его уже реализовал, но нужно ли оно мне? Насколько снизится скорость? -=Ustas=- Тоже пробовал. как правило не слишком удачные результаты выдает. |
| Автор: AntonioBanderaz 5.2.2006, 17:00 |
| Сам замерь... Я думаю не на много. Добавлено @ 17:01 Это уже не мне решать ))))) Замерь и посмотри что по твоим критериям выдаст наиболее приемлимый результат... |
| Автор: Borland_Delphi_6 9.2.2006, 16:39 | ||||
Блин, что-то я никак врубится не могу. Как мне с помощью LIKE сделать такую фигню: поиск ищет точное слово, но оно может встречатся в любом месте в тексте? Т.е. есть текст:
Мне нужно найти слово "сочный". Если сделать "%сочный%", то помимо страницы с текстом №1, выдаст также и страницу №2. Если сделать просто WHERE smth = 'сочный', то не найден ни того, ни другого |
| Автор: AntonioBanderaz 9.2.2006, 16:52 |
| RLIKE попробуй либо регульками в базе, а я бы сделал полнотекстовым!!! |
| Автор: Borland_Delphi_6 9.2.2006, 20:25 | ||
Вот что у меня получилось:
Как видно, далеко не самый удачный вариант. Как бы эти длинные условия ("news_title RLIKE '$logic_or[0]' OR news_text RLIKE '$logic_or[0]' OR news_title RLIKE '$logic_or[1]' OR news_text RLIKE '$logic_or[1] OR news_title RLIKE '$logic_or[2]' OR news_text RLIKE '$logic_or[2]'") заменить регулярными выражениями? Насколько я понимаю, это ведь можно сделать? |
| Автор: -=Ustas=- 10.2.2006, 09:32 | ||
Borland_Delphi_6, тебе же уже советовали полнотекстовый поиск делать.... И выход этот правильный, т.к. через созданный индекс можно производить не физический, а логический поиск. Правда это если мускул не менее 4-ой версии.
И так далее, дальше можешь сам почитать |
| Автор: Borland_Delphi_6 10.2.2006, 17:05 |
| -=Ustas=- Да я пытаюсь, но полнотекстовый поиск не могу наладить для поля news_title, а для news_text все сделать удалось. Можно увидеть, какой запрос необходимо выяснить, чтобы разрешить полнотекстовый поиск для опр. поля? |
| Автор: -=Ustas=- 10.2.2006, 17:21 |
| Borland_Delphi_6, тонкую настройку "http://dev.mysql.com/doc/refman/4.0/ru/fulltext-fine-tuning.html" смотрел? Может тебе переменный надо настроить. |
| Автор: Borland_Delphi_6 10.2.2006, 17:54 |
| -=Ustas=- Мне честно говоря этот полнотекстовый поиск не очень симпатизирует, из-за того, что он сам решает, на какие слова реагировать, а на какие нет, а также из-за своей нагрузки на БД... Но попробую чего-нибудь сделать. Мой вопрос по поводу оптимизации запроса в силе. Если непонятно, что я пытался спросить - дайте знать |
| Автор: Borland_Delphi_6 10.2.2006, 18:38 | ||||||
Короче, делаю два запроса на создание индексов поиска:
Индексы вроде создаются. Дальше пытаюсь искать таким вот запросом:
И получаю ошибку:
Причем если искать по одному полю, то все ок. В чем трабл? |
| Автор: AntonioBanderaz 10.2.2006, 19:16 | ||||
Ну как-то так короче... Добавлено @ 19:18
А так? |
| Автор: Borland_Delphi_6 11.2.2006, 16:51 | ||||
| Спасибо конечно, но я поиск под движок пишу, так что мне все эти классы ни к чему
Ну я и тормоз
|
| Автор: AntonioBanderaz 11.2.2006, 21:26 | ||||||
а какая разница, он наиболее универсален... просто
И он у тебя будет искать в таблице ldu_news в полях news_text и news_title... по умолчанию любой разделитель является логическим OR, только эскейпь строку перед подачей... Чтобы твою логику добавить просто нужно поменять ф-ию
|
| Автор: IZ@TOP 12.2.2006, 00:58 |
| Borland_Delphi_6, а с чего ты взял что fulltext поиск будет тормозить? Вообще-то насколько я знаю, он работает на треть быстрее, нежели тот же like. А других способов поиска по тексту, кроме двух описанных, я не знаю! Просвятите дуралея! |
| Автор: Borland_Delphi_6 12.2.2006, 11:51 |
| IZ@TOP, Вроде бы в доках написано, что в fulltext таблицы данные будут добавлятся медленнее... AntonioBanderaz, Это я к тому, что мне нет особого смысла использовать твой класс целиком, т.к. поиск у меня будет в одном файле и мне не трудно вручную написать запрос Спасибо! Добавлено @ 11:55 AntonioBanderaz, Хотя я тут подумал (за 2 минуты-то! |
| Автор: Borland_Delphi_6 12.2.2006, 14:41 | ||
| AntonioBanderaz, Попытался я воткнуть в свой скрипт этот класс - пришел к выводу, что нет в этом особого смысла...
Что касается OR: есть страница с заголовком вроде "Обзор Galaxy 6600GE". Если я хочу поискать "Обзор Galaxy" - нет проблем, результат верен, а если "Обзор 6600GE" - то тут уже ничего не выдается. Вопрос в силе - есть ли возможность использовать OR и AND без BOOLEAN MODE? |
| Автор: IZ@TOP 13.2.2006, 14:40 |
| Borland_Delphi_6, так мы же играем на выборке?! Или нет? |
| Автор: Borland_Delphi_6 13.2.2006, 15:47 |
| IZ@TOP, Чего-то я тебя не понял... |
| Автор: IZ@TOP 14.2.2006, 11:34 |
| Borland_Delphi_6, Ты говоришь о тормазах при вставке данных, но мы ведь поиск юзаем по документам при селекте, а вставки дай бог несколько раз в день делаем. |
| Автор: Borland_Delphi_6 14.2.2006, 15:55 |
| IZ@TOP, Отнюдь, обновлять-то сайт часто надо. Но не это главное, т.к. у меня сервер 4х AMD Opteron... |
| Автор: Borland_Delphi_6 15.2.2006, 21:33 | ||||
Никак не возьму в толк: что нужно сделать, чтобы MySQL мне вернула строку лишь в том случае, если есть полное совпадение. Пример:
По запросу "дом" текст 1 должен найтись, а текст 2 - нет. Как такое устроить? Обратите внимание, что искомое слово может содержаться в любом месте текста, поэтому банальное сравнение через "=" не подойдет... |
| Автор: CTAPbIuMABP 17.2.2006, 15:02 | ||||||
а конкретно для твоего примера
|
| Автор: AntonioBanderaz 18.2.2006, 19:36 | ||||
не всё найдёт, допустим в строке
Слово дом он не найдёт... Добавлено @ 19:40
|
| Автор: Borland_Delphi_6 19.2.2006, 15:55 |
| Спасибо за советы, но я уже решил остановится на другом варианте с использованием RLIKE, который вполне нормально находит точное совпадение, в то же время, если использовать его для поиска одного слова, то выдает больше результатов, чем FULLTEXT Search, т.е. для RLIKE более мягкие условия получаются что-ли... Результат моих (или даже наших? |
| Автор: IZ@TOP 19.2.2006, 16:15 | ||
А, ну если у тебя сидит 20 авторов и каждый раз в минуту что-то постит... и посетителей в этот момент на сайте в течении часа в районе тысячи... даже в таком случае сомневаюсь что производительность упадет очень сильно... тем более при такой системе... |
| Автор: Borland_Delphi_6 19.2.2006, 17:50 |
| IZ@TOP, Да с этим уже разобрались |