поиск в базе данных
Как сделать хороший поиск нескольких русских слов в mySQL базе без учета регистра?
Цитата:
Originally posted by Cover
Как сделать хороший поиск нескольких русских слов в mySQL базе без учета регистра?
Как сделать хороший поиск нескольких русских слов в mySQL базе без учета регистра?
Цитата:
Дело человек говорит. Или, если тебе не нужна релевантность, и ты не хочешь добавлять FULLTEXT поля и FULLTEXT индексы, можешь использовать функции CONCAT() и LCASE()
То-бишь, объединять поля в строку текста и перегонять в lowercase прямо в запросе. Но тогда разные окончания слов (напр. "поиск" и "поиска") попьют у тебя кровушки.
Покрутил я сам эту функцию и так и этак. Фигня!
1. "Похожесть" слов по боку, что уже хуже, чем %LIKE%
2. Если нужное слово встречается в более 50% записей, оно игнорируется. С одной стороны правильно, а с другой, если база тематическая, то можно смело вешаться.
2.1. Это можно исправить пользуясь опцией IN BOOLEAN MODE, но она есть только начиная с версии 4.0.1
2.1.1. Даже, если тебе повезло, и у тебя 4.0.1., то искать фразы, содержащие арифметические знаки или даже просто - лучше не надо, чтобы не расстраиваться.
ergo
Этот способ годится для больших баз с кучей текста, желательно такого, чтобы пользователь ну хоть что-то получил в любом случае, и для точных словосочетаний.
Используй идею, которую я дал, как извращение.
А интересует меня 1)как искать, чтобы не было чувсвительности к регистру.
2)как искать много слов в одном запросе (кроме LIKE %smth% AND...) и без FULLTEXT
Цитата:
Originally posted by Cover
Ну вы даете. Я новый яндекс делать не собираюсь. Мне всего-то надо поиск по сайту (новости, форум и пр.) сделать.
А интересует меня 1)как искать, чтобы не было чувсвительности к регистру.
2)как искать много слов в одном запросе (кроме LIKE %smth% AND...) и без FULLTEXT
Ну вы даете. Я новый яндекс делать не собираюсь. Мне всего-то надо поиск по сайту (новости, форум и пр.) сделать.
А интересует меня 1)как искать, чтобы не было чувсвительности к регистру.
2)как искать много слов в одном запросе (кроме LIKE %smth% AND...) и без FULLTEXT
Так, ни с тем, ни с другим Яндекса и не получится. Почитай ту самую ссылку (вот она) там есть то, что тебе надо. Просто реализуется и выполняется в 1 запрос. Регистр оно не учитывает. Правда, штука довольно сырая...
Либо что-то вроде (или как иначе)
Код:
$text_to_find = strtolower($text_to_find);
$query = "SELECT поля FROM таблица
WHERE
LCASE(CONCAT fld1,' ',fld2,' ',.....,fldN))
LIKE %$text_to_find%";
//Дальше соединяешься с базой и вытаскиваешь
.....
$query = "SELECT поля FROM таблица
WHERE
LCASE(CONCAT fld1,' ',fld2,' ',.....,fldN))
LIKE %$text_to_find%";
//Дальше соединяешься с базой и вытаскиваешь
.....
Свои глюки есть и у того метода и у другого. Подумать придется. Метод, описанный по ссылке, требует, чтобы поиск проводился либо по одному текстовому полю, на которое установлен FULLTEXT индекс, либо по группе полей, на которую он же установлен. NB не на каждое поле в отдельности, а один на вю группу полей.
Может кто-нить знает и как отсортировать в алфавитном порядке с русскими буквами? MySQL по ходу русский не понимает или ещё что, но сортировать никак не хочет.