Здраствуйте. Начну с того что руки у меня кривые а мышление очень креативное так вот написал я значит поиск лоховской, но после его теста понял что он обсольтно не умееть искать правильно, тоесть, он ищет, но ищет как, если написать в поиске "свет газ вода", и в обьявлении имеется "свет, газ, вода", но ежели написать "газ вода свет" то он уже не выведет обьявление.... но это полбеды, при повторном прочтении своего кода, я понял что я идиот =)))) код написан очень геморно и очень обьемно... Люди добрые помогите мне избавиться от первой проблемы и помогите оптимизировать код..... очень надо прошу до посинения стоя на коленях =) вот код PHP: function land_search($args) { $desc = $_POST['desc']; $cenmin = $_POST['cenmin']; $cenmax = $_POST['cenmax']; if(!$_POST['desc'] and !$args[1]){$desc=" ";} if($args[2]!=""){$cenmin=$args[2];} if($args[3]!=""){$cenmax=$args[3];} if (!$cenmax){$cenmax="9999";} if(!$cenmin){$cenmin="1";} if ($desc!="" or $args[1]!="" or $cenmin!="" or $cenmax!=""){ if (!$desc){$desc=urldecode($args[1]);} $desc = str_replace(" ", " ", $desc); $desc = str_replace(" ", "%", $desc); $page=(isset($args[0]))?$args[0]:1; $perpage=20; $start=($page-1)*$perpage; $res = $this->m['db']->query("select * from land WHERE (price BETWEEN '$cenmin' AND '$cenmax') AND (description LIKE '%$desc%') order by my desc, to_mkad"); $num=$this->m['db']->get_num_rows($res); $res = $this->m['db']->query("select * from land WHERE (price BETWEEN '$cenmin' AND '$cenmax') AND (description LIKE '%$desc%') order by my desc, to_mkad limit $start, $perpage"); $con .= " <form action='/land_search/' method=post> <table border=\"0\"> <tr> <td valign=\"bottom\">Ключевое слово</td> <td valign=\"bottom\">Цена От:</td> <td valign=\"bottom\">До:</td> <td> </td> </tr> <tr> <td style=\"padding: 7px;\"><input type=\"text\" name=\"desc\" value=\"".$_POST['desc']."\" size=\"70\"></td> <td style=\"padding: 7px;\"><input type=\"text\" name=\"cenmin\" value=\"".$_POST['cenmin']."\" size=\"10\"></td> <td style=\"padding: 7px;\"><input type=\"text\" name=\"cenmax\" value=\"".$_POST['cenmax']."\" size=\"10\"></td> <td style=\"padding: 7px;\"> <input type=submit value='Поиск'></form></td> </tr> </table><br> <table class='land_tab' width=100% cellspacing=0 cellpadding=0><tr class=line1> <td align=center style=\"padding: 7px;\"><B>№</B></td> <td align=center style=\"padding: 7px;\"><B>Км. от МКАД</B></td> <td align=center style=\"padding: 7px;\"><B>Цена тыс.$</B></td> <td align=center style=\"padding: 7px;\"><font size='4'>S</font><B>уч.</B></td> <td align=center style=\"padding: 7px;\" width='170'><B>Направление / Нас. пункт</B></td> <td align=center style=\"padding: 7px;\"><B>Описание</B></td> <td align=center style=\"padding: 7px;\"><B>Фото</B></td> </tr>"; $k = $start; while ($r = $this->m['db']->fetch_array($res)) { $k++; $st = ($k % 2) ? "line2" : "line1"; $con .= "<tr class='$st'> <td align=center style=\"padding: 7px;\">$k</td> <td align=center style=\"padding: 7px;\">$r[to_mkad] км.</td> <td align=center style=\"padding: 7px;\">$r[price] $</td> <td align=center style=\"padding: 7px;\">$r[square]</td> <td align=center style=\"padding: 7px;\">$r[direction]<br>$r[town]</td> <td align=justify style=\"padding: 7px;\"><a href='./land_full/".$r['id']."'><font color='#DBDBDB'>$r[description]</font></a></td> <th align=center>" . ((file_exists(site_path . "/upload/$r[id].jpg")) ? "<div id='good_img'><a href='/upload/$r[id].jpg'><img src='/thumb/$r[id]' width='130' alt='земельный участок, продажа земли ".$r[town]." ".$r[direction]."' title='земельный участок, продажа земли ".$r[town]." ".$r[direction]."'></a></div>" : "<img src='/images/noimg.jpg' width='130' alt='земельный участок, продажа земли ".$r[town]." ".$r[direction]."' title='земельный участок, продажа земли ".$r[town]." ".$r[direction]."'>") . "</th> </tr>"; } $con .= "</table>"; $con .= "<h3>$num</h3>"; $con.="<table border=\"0\" width=\"100%\" id=\"table1\" cellspacing=\"0\" cellpadding=\"0\"><tr><td align=\"right\" width=\"50%\">".(($page>1)?"<a href='/land_search/".($page-1)."/".urlencode($desc)."/".$cenmin."/".$cenmax."'><<<Предыдущие</a> ":"")."</td>"; $con.="<td align=\"left\" width=\"50%\">".((($page*$perpage)<$num)?" <a href='/land_search/".($page+1)."/".urlencode($desc)."/".$cenmin."/".$cenmax."'>Следующие>>></a>":"")."</td></tr></table>"; } else{ $page=(isset($args[0]))?$args[0]:1; $perpage=20; $start=($page-1)*$perpage; $res = $this->m['db']->query("select * from land order by my desc, to_mkad"); $num=$this->m['db']->get_num_rows($res); $res = $this->m['db']->query("select * from land order by my desc, to_mkad limit $start, $perpage"); $con = " <form action='/land_search/' method=post> <table border=\"0\"> <tr> <td valign=\"bottom\">Ключевое слово</td> <td valign=\"bottom\">Цена От:</td> <td valign=\"bottom\">До:</td> <td> </td> </tr> <tr> <td style=\"padding: 7px;\"><input type=\"text\" name=\"desc\" value=\"".$_POST['desc']."\" size=\"70\"></td> <td style=\"padding: 7px;\"><input type=\"text\" name=\"cenmin\" value=\"".$_POST['cenmin']."\" size=\"10\"></td> <td style=\"padding: 7px;\"><input type=\"text\" name=\"cenmax\" value=\"".$_POST['cenmax']."\" size=\"10\"></td> <td style=\"padding: 7px;\"> <input type=submit value='Поиск'></form></td> </tr> </table> <table class='land_tab' width=100% cellspacing=0 cellpadding=0><tr class=line1> <td align=center style=\"padding: 7px;\"><B>№</B></td> <td align=center style=\"padding: 7px;\"><B>Км. от МКАД</B></td> <td align=center style=\"padding: 7px;\"><B>Цена тыс.$</B></td> <td align=center style=\"padding: 7px;\"><font size='4'>S</font><B>уч.</B></td> <td align=center style=\"padding: 7px;\" width='170'><B>Направление / Нас. пункт</B></td> <td align=center style=\"padding: 7px;\"><B>Описание</B></td> <td align=center style=\"padding: 7px;\"><B>Фото</B></td> </tr>"; $k = $start; while ($r = $this->m['db']->fetch_array($res)) { $k++; $st = ($k % 2) ? "line2" : "line1"; $con .= "<tr class='$st'> <td align=center style=\"padding: 7px;\">$k</td> <td align=center style=\"padding: 7px;\">$r[to_mkad] км.</td> <td align=center style=\"padding: 7px;\">$r[price] $</td> <td align=center style=\"padding: 7px;\">$r[square]</td> <td align=center style=\"padding: 7px;\">$r[direction]<br>$r[town]</td> <td align=justify style=\"padding: 7px;\"><a href='./land_full/".$r['id']."'><font color='#DBDBDB'>$r[description]</font></a></td> <th align=center>" . ((file_exists(site_path . "/upload/$r[id].jpg")) ? "<div id='good_img'><a href='/upload/$r[id].jpg'><img src='/thumb/$r[id]' width='130' alt='земельный участок, продажа земли ".$r[town]." ".$r[direction]."' title='земельный участок, продажа земли ".$r[town]." ".$r[direction]."'></a></div>" : "<img src='/images/noimg.jpg' width='130' alt='земельный участок, продажа земли ".$r[town]." ".$r[direction]."' title='земельный участок, продажа земли ".$r[town]." ".$r[direction]."'>") . "</th> </tr>"; } $con .= "</table>"; $con.="<table border=\"0\" width=\"100%\" id=\"table1\" cellspacing=\"0\" cellpadding=\"0\"><tr><td align=\"right\" width=\"50%\">".(($page>1)?"<a href='/land/".($page-1)."'><<<Предыдущие</a> ":"")."</td>"; $con.="<td align=\"left\" width=\"50%\">".((($page*$perpage)<$num)?" <a href='/land/".($page+1)."'>Следующие>>></a>":"")."</td></tr></table>";} $this->m['t']->set('title', "Земельные участки"); $this->m['t']->set('main', $con); $this->desc('land', $page); $this->m['t']->show('indexfull'); }
Да, можно. Английский -http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html Русский - http://www.mysql.ru/docs/man/Fulltext_Search.html http://habrahabr.ru/blogs/mysql/25646/
Можешь аргументировать почему не подходит? В принципе если свой сервер идеальным решением будет сфинкс.
нет сервер не свой оббычный хостинг... не бодходит по томучто нужно постоянно сначала индексировать... что не есть гуд.... плюс это очень трудоемко..... я кстати придумал как примерно избавиться но моих знаний наврядли хватит... Смысл какой... каждое слово разделенное пробелом он записывает в массив затем проверят каждое слово отдельно записывает в найденный масив затем отфильтровывает одинаковые обьявления... но на это моих знаний наврятли хватит... Поэтому люди очень прошу помогить сделать так как я описал выше....
Тогда проще, каждое слово разделенное разделителем пихаешь в массив, а потом делаешь поиск не where description LIKE '%$desc%', а where description LIKE '%$desc[0]%' and description LIKE '%$desc[1]%' and description LIKE '%$desc[3]%' и так пока массив не кончится.
kirpi4, у меня было похожее решение, я создал таблицу(к сожалению исходный код был умерщвлен за ненужностью): url word weight Индексация была такой: 1. Обрабатываем текст, делаем несколько массивов слов по весам(у меня был вес от одного до 10-ти, разделение типа "редкие" слова, слово было в ссылке, слово было в заголовке и т.д. 2. Затем слова обрабатывались PHPMorphy и выбиралась нормальная форма каждого из слов. 3. Пишем слова в базу, причем пишем и "нормальную" форму и ту которая была использована в тексте изначальной, для той что была использована в тексте изначально ставим вес в 2 раза Выше. Поиск таким: 0. если текст очень маленький или очень большой шлем нах 1. Делаем из введенного текста массив слов. 2. Делаем из введенного текста массив слов в нормальной форме (через PHPMorphy) 3. Ищем, не помню точного запроса, было что то вроде: 2 запроса в одном только слова в ранее введенной форме, во втором все слова, групировка по URL, сортируем по SUM(weight) По тому с какой скоростью это работало не скажу, т.к. на высоконагруженных проектах он не использовался. Но думаю оно работало довольно таки медленно. Потом пробовал еще такой вариант(пытался сделать, что бы по запросу Олексей находило Алексей и Оликсей и т.д.): 1. Переводим все слова в транслит. 2. Считаем для них DM-код 3. Пишем слово и DM код в БД. Ну а при поиске текст запроса преобразовываем в Дм код и выбираем вначале слово в нормальной форме, а потом все совпадающие ДМ коды. В результате получилось ужасное позорище: (возможно конечно у меня косячно цифровой код генерился), например по запросу "Аля" выводилось: Аля, Оля (что нормально) Алсу, Олеся (что сурово) Илья(что вообще косяк) А по запросу "Мудак" находился Митька(о_О). Перепробовав еще несколько вариантов(для поржать хватит и этих двух, умного там ничего не было, поэтому выкладывать не буду) я понял что с моим опытом работы (1.5 года) я не смогу написать нормальную поисковую систему, которая бы быстро искала как слова в разной форме так и слова с Ашибками. И если нужен будет такой поиск буду юзать Sphinx чего и Вам желаю
хм... говорите сфинкс... можете тогда помочь с установкой... просто что что а никакие скрипты на перле я не умею юзать... По поводу слов с ашибками ведь есть сервисы которые проверяют на правельность слов а почемубы нам не прикрутить такую шнягу чтоб сначала проверило а затем искало???
kirpi4, потому что если на Вашем сайте будет искать хотя бы несколько тысяч человек этот сервис Вас забанит, а даже если и не забанит, то Ожидание ответа от удаленного сервиса для каждого поискового запроса Вас "убъёт" Не совсем понимаю при чем тут Perl, Sphinx написана на C++. Официальное Api для PHP также имеется. Вот пара ссылок "для затравки": Простое пример применения Sphinx и PHP. Что-то похожее, но немного другое Увы, я не смогу Вам рассказать больше этих ссылок поскольку читал только их + английский мануал. На РИТе и PHPConf 2008 Аксёнов рассказывал про Sphinx, но к сожалению у меня видео не сохранилось. UPD: Еще можете попробовать Psih'a отловить на этом форуме, он в свое время меня с Sphinx познакомил
спасибо почитаю.... и еще вопросик подскажите как пребразовать код чтобы он отфильровывал пустые массивы и еще слова которые состоят из менее чем 3 букв... PHP: <?php $string='Вот, такой, дурацкий, текст, "проста "проверка; ;на фильтрацию/ /.символов. ,,'; $s = array(",", ".", "/", "'", "\"", ":", ";", "-", "_", "!"); $bez_znaka = str_replace($s ,"", $string); $arr1 = explode (" ", $bez_znaka); for ($i = 0; $i <= count($arr1); $i++) { echo "$i - ".$arr1[$i]."\n"; } ?> выполнением данного кода будет следующее Код (Text): 0 - Вот 1 - такой 2 - дурацкий 3 - текст 4 - проста 5 - проверка 6 - на 7 - фильтрацию 8 - символов 9 - 10 -
kirpi4, пройтись по массиву PHP: <?php foreach($arr1 as $key=>$word){ if(empty($word)){ unset($arr1[$key]); } elseif(mb_strlen($arr1[$key])){ unset($arr1[$key]); } ?> Либо изначально делить регуляркой и там выставить но ей будет дольше выполнятся
дабы не создавать новую тему решил написать здесь.... у меня возникла проблема следующего рода.... имеется массив: Код (Text): [0] => 11 [1] => 17 [2] => 24 [3] => 33 [4] => 36 и запрос в базу данных PHP: $res = $this->m['db']->query("select * from land order by my desc, to_mkad"); Мне нужно чтобы этот запрос выбирал только те строки где id равен значениям из массива но чтобы в дальнейшем можно было выводить значения таким кодом PHP: while ($r = $this->m['db']->fetch_array($res)) {print $r[id];} Заранее блогодарю
PHP: <?php $query = 'SELECT `la`, `la` FROM `tri_rubla` WHERE `id` IN ('.implode(', ', $myArr).')'; ?> Оно?
в общем я схему понял изменил и вроде заработало, но не так как надо..... он выбрал почемуто первый ид и все...
ух разобрался в чем дело было ему мешали скобочки =))) в итоге получил нечто вида PHP: $zapros = implode(', ', $arrs); $res = $this->m['db']->query("select * from land WHERE id IN ($zapros) order by my desc, to_mkad"); Возник еще вопрос.... решил сделать так чтобы жырными буквами и белым цветом становились слова которые стоят в поиске... сделал но не до конца =)))) что именно не работает : он вроде делает все как надо... но если допустим в поиске написанно "участок" а в обьявлении написанно "Участок" то он не станет его обводить...... как решить эту проблему??? вот мой код помогите изменить.... PHP: $r[description] = str_replace($word, "<font color='#FFFFFF'><b>$word</b></font>", $r[description]); Заранее благодарю. P.S. ОГРОМНОЕ СПАСИБО akrinel ТЫ МНЕ ОЧЕНЬ ПОМОГ!!!!!!!!
Можно решить регуляркой. Но это, возможно, при больших наплывах посетителей будет тормозить. Впрочем можно поиграться с длинной текста, выводимого в результатах поиска или упростить регулярку. Короче, найти оптимальное сочетание "цена/качество". Пример регулярки из моего старого движка(точно работает на PHP 5.2.6, кодировка UTF-8): PHP: <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $text = 'Я средних размеров проверочный Текст. В отличии от других текстов, я могу быть написан как ТеКсТ и как текст, и даже как "Текст" в любом случае выделятся будет только слово текст отдельно стоящее, а не являющееся частью другого слова. Это, бесспорно, в какой-то мере ошибочно. Например слово "текстов" было бы неплохо выделить. Это ведь тоже Я! Но уж очень лениво было моему создателю писать для этого регулярное выражение. Также стоит заметить: в регулярном выражении стоит учитывать, что я могу писаться слитно с каким либо пунктационным знаком. Например: текст. Текст! ТеКсТ? P.S. Я набран совершенно безграмотным человек, так что «Grammar nazi» здесь делать нечего. Мой создатель и так знает, что я полон ошибками. Спасибо за Внимание. С уважением, Ваш Текст.'; echo '<h1>До</h1>'; echo '<pre>'.$text.'</pre><br />'; $text = preg_replace('/(текст)([\s\.\!\?\,\"]{1})/ui', '<span style="color: red">$1</span>$2', $text); echo '<h1>После</h1>'; echo '<pre>'.$text.'</pre>'; ?> </body> </html> Мне тоже помогали и помогают Я просто отдаю свой долг)
А может всё таки FULLTEXT индекс? Он обновляет автоматом всё при добавлении, так что делать ничего дополнительно не надо, только SELECT запрос правильно написать.
Psih Если быть честным то FULLTEXT индекс я не стал использовать только лиш по тому что даже понятия не имею о нем темболее как он работает и как при помощи него написать поиск =)))) поэтому если ты приведеш самый простой пример поиска на нем то наверняка переведу поиск =)
kirpi4 В мануале по mysql это врекрасно описано, в добавок куча статей только на одном хабре: http://habrahabr.ru/search/?q=fulltext+mysql (http://habrahabr.ru/blogs/webdev/40218/ прекрасная статья именно о Fulltext search) , а уж в интернете и того больше. Fulltext search не подходит только в том случае, если кол-во данный начинает переваливать за несколько гигабайт, тогда уже надо переходить на Sphinx - и то, жить можно, просто MySQL долго думает с большим кол-вом данных.
спасибо на досуге почитаю.... =) если интересно что у меня уже получилось можете посмотреть land25.ru/land/search/