Кто шарит, подскажите плз, возможно ли, юзая FULLTEXT, искать ПОДСТРОКИ а не только целые слова? PHP: mysql> select * from TEST; +--------------------+---------------+------------------------+ | a | b | c | +--------------------+---------------+------------------------+ | kartinka88.jpg | image/jpeg | cool girl | | moja programma.exe | exe/something | IDPBrute v.0.1 | | manson.mp3 | mp3 file | krutaja pesnya Mansona | +--------------------+---------------+------------------------+ 3 rows in set (0.00 sec) mysql> select * from TEST where match(a,b,c) against('moja'); +--------------------+---------------+----------------+ | a | b | c | +--------------------+---------------+----------------+ | moja programma.exe | exe/something | IDPBrute v.0.1 | +--------------------+---------------+----------------+ 1 row in set (0.00 sec) mysql> select * from TEST where match(a,b,c) against('jpg'); Empty set (0.04 sec) Как видите, поиск по "jpg" ничего не дал, т.к. во-первых, это подстрока, во-вторых, это слово меньше трех букв, в-третьих, фуллтекст еще и умничает, думая что это общеупотребимое слово (часто встречается в строках). Ну не пиздец? Придется обратно на LIKE переходить...? Если это невозможно, то плз подскажите как лучше реализовать поиск по ключевым словам, при том что их может быть несколько (кол-ва не знаю), пока что я извратился, дописывая mysql запрос в цикле: PHP: $string1="SELECT COUNT(*) FROM $infotable WHERE LOWER(fname) LIKE '%$word%' OR LOWER(ftext) LIKE '%$word%'"; foreach($words as $word) { $string1.=" OR LOWER(fname) LIKE '%$word%' OR LOWER(ftext) LIKE '%$word%'"; } $string1.=" ORDER BY fid DESC LIMIT $from,$step"; такой вариант "удовлетворителен" но не нравится т.к. запрос может получиться длинный, и еще потому что это MYSQL а не MYSQLI, пример запроса на MYSQLI: PHP: $word='%test%'; $link=mysqli_connect('localhost',"$baselogin","$basepass","$database"); $stmt=$link->prepare("SELECT COUNT(*) FROM $infotable WHERE LOWER(fname) LIKE '?' OR LOWER(ftext) LIKE '?'); $stmt->bind_param("ss",$word,$word); $stmt->execute(); $stmt->close(); $link->close();
Могу посоветовать копать в сторону Sphinx - придется немного погеморроиться при установке, настройке индексов итд - но его быстродействие и эффективность окупят все усилия с лихвой. Поддерживает поиск со * (включая части слова и подстроки) и еще кучу опций. Sphinx работает намного быстрее мускульного поиска по FULLTEXT индексу - особенно заметно на больших нагрузках.