Ни как немогу сделать нормальную поисковую систему, помогите с технологией поиска
Информация находиться в базе MySql
1. Baton - 21 Сентября, 2006 - 13:37:54 - перейти к сообщению
2. evgenijj - 22 Сентября, 2006 - 14:21:39 - перейти к сообщению
3. Baton - 25 Сентября, 2006 - 08:49:49 - перейти к сообщению
классно
4. evgenijj - 09 Октября, 2006 - 10:58:39 - перейти к сообщению
Тут пришлось писать систему поиска по каталогу продукции - может кому и пригодится.
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- require "./cfg/general.inc.php";
- require "./cfg/connect.inc.php";
- require "./functions/mysql.php";
- // Соединяемся с базой данных
- // Количество записей результатов поиска на странице
- echo get_html_search();
- function get_search_form()
- {
- $html = "<form name='search' action='".$_SERVER["PHP_SELF"]."' method='GET'>[slash]n";
- $html = $html."Поиск:<input value='Введите слово' name='query' onfocus=[slash]"query.value=''[slash]" size='20' maxlength='64'/>[slash]n";
- $html = $html."<input type='submit' value='Искать'/>[slash]n";
- $html = $html."</form>[slash]n";
- return $html;
- }
- function get_html_search()
- {
- {
- $html = "<h3>Поиск</h3>[slash]n".get_search_form();
- }
- else
- {
- // Обрезаем строку до длины, указанной в атрибуте maxlength
- // Убираем пробелы в начале и конце строки поиска
- // Убираем все "ненормальные" символы
- // Сжимаем двойные пробелы
- // Получаем корни искомых слов
- $stemmer = new Lingua_Stem_Ru();
- foreach ( $tmp as $wrd )
- {
- // Если слово очень короткое - не используем его в поиске
- $words[] = $stemmer->stem_word($wrd);
- }
- // Склеиваем массив $words обратно в строку
- $search_str = $search_str."*";
- // Составляем запрос к БД, чтобы узнать количество записей в результатах поиска -
- // это нужно для построения постраничной навигации
- $search_query = "SELECT COUNT(*)
- FROM ".PRODUCTS_TABLE."
- WHERE MATCH (name, description) AGAINST ('".$search_str."' IN BOOLEAN MODE)>0";
- $res = db_query( $search_query );
- $total = db_result( $res, 0, 0 );
- // Проверяем передан ли номер текущей страницы - постраничная навигация
- $page = $_GET['page'];
- else
- $page = 1;
- // Начальная позиция
- $start = ($page - 1) * SEARCH_RESULT_ON_PAGE;
- if ( $total > 0 )
- {
- $html = "<h3>Результаты поиска:</h3>[slash]n";
- $html = $html."<p>Вы искали: ".$good."</p>[slash]n";
- $search_query = "SELECT productID, name, description,
- MATCH (name, description) AGAINST
- ('".$search_str."' IN BOOLEAN MODE) AS relev
- FROM ".PRODUCTS_TABLE."
- HAVING relev>0 ORDER BY relev DESC LIMIT ".$start.", ".SEARCH_RESULT_ON_PAGE;
- $res = db_query( $search_query );
- // Это для подсвечивания искомых слов
- $html = $html."<table width='100%' cellspacing='4' cellpadding='2'>[slash]n";
- $html = $html."<tr bgcolor='#EEEEEE'><th width='5%'>ID</th><th>Наименование</th><th >Описание</th></tr>[slash]n";
- while ( $result = db_fetch_array( $res ) )
- {
- $html = $html."<tr bgcolor='#F5F5F5' valign='top'>[slash]n";
- $html = $html."<td>".$result["productID"]."</td>[slash]n";
- // Подсвечиваем искомые слова
- $result["name"] = eregi_replace($highlight, "<font color='#cc0000'>[slash][slash]0</font>", $result["name"]);
- $html = $html."<td>".$result["name"]."</td>[slash]n";
- // Подсвечиваем искомые слова
- $result["description"] = eregi_replace($highlight, "<font color='#cc0000'>[slash][slash]0</font>", $result["description"]);
- $html = $html."<td>".$result["description"]."</td>[slash]n";
- $html = $html."</tr>[slash]n";
- }
- $html = $html."</table>[slash]n";
- // Число страниц с результатами поиска
- // Постраничная навигация
- if ( $cnt_pages > 1 )
- {
- $html = $html."<div style='margin-left:4px'>";
- for( $i = 1; $i <= $cnt_pages; $i++ )
- {
- if($i != $cnt_pages)
- {
- if($page == $i)
- {
- $html = $html."[".(($i - 1)*SEARCH_RESULT_ON_PAGE + 1)."-".$i*SEARCH_RESULT_ON_PAGE."] ";
- }
- else
- {
- $html = $html."<a href='".$_SERVER["PHP_SELF"]."?page=".$i."&query=".$good."'>[".(($i - 1)*SEARCH_RESULT_ON_PAGE + 1)."-".$i*SEARCH_RESULT_ON_PAGE."]</a> ";
- }
- }
- else
- {
- if($page == $i)
- {
- $html = $html."[".(($i - 1)*SEARCH_RESULT_ON_PAGE + 1)."-".$total."] ";
- }
- else
- {
- $html = $html."<a href='".$_SERVER["PHP_SELF"]."?page=".$i."&query=".$good."'>[".(($i - 1)*SEARCH_RESULT_ON_PAGE + 1)."-".$total."]</a> ";
- }
- }
- }
- $html = $html."</div>[slash]n";
- }
- }
- else
- {
- $html = "<h3>Результаты поиска:</h3>[slash]n<p>Ничего не найдено.</p>[slash]n";
- }
- }
- return $html;
- }
- ?>
А класс для извлечения корней русских слов можно взять на сайте Дмитрия Котерова:
http://forum[dot]dklab[dot]ru/php/advise[dot][dot][dot]RussianWord[dot]html