За последние 24 часа нас посетили 17312 программистов и 1617 роботов. Сейчас ищут 1104 программиста ...

Поиск по сайту

Тема в разделе "PHP для новичков", создана пользователем Blond, 5 ноя 2007.

  1. Blond

    Blond Активный пользователь

    С нами с:
    3 окт 2006
    Сообщения:
    87
    Симпатии:
    0
    Обьясните пожалуйста общую схему осуществления поиска по сайту.
     
  2. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    сайт свой или чужой? на чем построен?
     
  3. Blond

    Blond Активный пользователь

    С нами с:
    3 окт 2006
    Сообщения:
    87
    Симпатии:
    0
    сайт мой. Написан в основном на html с добавлением простеньких алгоритмиков на php. В нем получилось много страниц (<200) и я подумал, что бы ло бы не плохо организовать поиск, ну что бы посетителям меньше мароки было.
     
  4. Anonymous

    Anonymous Guest

    Перенес. Не в блондинок, заметьте, не в блондинок! ;)
    Сложный вопрос. Неопределенный. Расскажи подроблнее, как у тебя организован сайт технически.
     
  5. jamper

    jamper Активный пользователь

    С нами с:
    27 окт 2007
    Сообщения:
    12
    Симпатии:
    0
    Как повод для размышлений могу такое предложить...

    Просто каждую страницу запихивать в массив и вырезая теги хтмл и все пхп выполнять поиск необходимого. Если совпадение найдено, то тогда заносить данную страницу ( ее название ) в другой массив или в таблицу бд. И такое проводить с каждой страницей. Если организовать это все в один поток, то будет долго :( а вот если в несколько :)
     
  6. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Если есть БД - имхо так же, все страницы занести в БД, создать табличку для кеша, в нее при поиске в страницах заносить время поиска, слово и номера найденых страниц. Таким образом повторным поиском можно сначала выуживать если в кеше поиск по этому слову и не состарился он на 6 часов (ну или сколько там кеш храниться будет, если статика - можно вообще кеш обнулять вручную после модификации сайта). Ну а если данных нет в кеше - искать.
    Если БД нет - плохо :) Сделать тот же кеш найденых номеров страниц в файл. Один файл - один поиск, в качестве имени можно взять md5(strlower(Поиск)).".txt". Даже быстрее местами будет - есть файл - есть кеш, нет файла - будем тормозить и делать полный поиск :)
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Можно использовать полноконтекстовый поиск, который предоставляет MySQL в таблицах типа MyISAM. Тогда всё что нужно будет сделать:
    1) Просканировать сайт, собрать список всех страниц.
    2) Записать полученные данные со страниц в БД или лучше записать собственно сам контент без лишнего оформления, предварительно вырезвав HTML тэги.
     
  8. ValaR

    ValaR Активный пользователь

    С нами с:
    3 май 2007
    Сообщения:
    196
    Симпатии:
    0
    Адрес:
    Челябинск
  9. redmi

    redmi Активный пользователь

    С нами с:
    10 окт 2007
    Сообщения:
    12
    Симпатии:
    0
    Пример программы поиск по сайту из книги "PHP. Рецепты программирования." Скляр, Трахтенберг: "Программа ищет указанный терм (хранящийся в $_REQUEST['term']) во всех файлах указанного множества каталогов под корнем документа. Эти каталоги перечислены в переменной $search_dirs. Она рекурсивно заходит в подкаталоги и следует по символьным ссылкам, но при этом отслеживает просмотренные файлы и каталоги, чтобы не войти в бесконечный цикл."
    PHP:
    1. <?php
    2. class SiteSearch {
    3.     public $bodyRegex = '';
    4.     protected $seen = array();
    5.    
    6.    
    7.     public function searchDir($dir) {
    8.         // array to hold pages that match
    9.         $pages = array();
    10.  
    11.         // array to hold directories to recurse into
    12.         $dirs = array();
    13.  
    14.         // mark this directory as seen so we don't look in it again
    15.         $this->seen[realpath($dir)] = true;
    16.    
    17.         try {
    18.             foreach (new RecursiveIteratorIterator(
    19.             new RecursiveDirectoryIterator($dir)) as $file) {
    20.                 if ($file->isFile() && $file->isReadable() &&
    21.                 (! isset($this->seen[$file->getPathname()]))) {
    22.                     // mark this as seen so we skip it
    23.                     // if we come to it again
    24.                     $this->seen[$file->getPathname()] = true;
    25.                    
    26.                     // load the contents of the file into $text
    27.                     $text = file_get_contents($file->getPathname());
    28.  
    29.                     // if the search term is inside the body delimiters
    30.                     if (preg_match($this->bodyRegex,$text)) {
    31.  
    32.                     // construct the relative URI of the file by removing
    33.                     // the document root from the full path
    34.                     $uri = substr_replace($file->getPathname(),'',0,strlen
    35.                     ($_SERVER['DOCUMENT_ROOT']));
    36.  
    37.                     // if the page has a title, find it
    38.                     if (preg_match('#<title>(.*?)</title>#Sis',$text,$match)) {
    39.                         // and add the title and URI to $pages
    40.                         array_push($pages,array($uri,$match[1]));
    41.                     } else {
    42.                         // otherwise use the URI as the title
    43.                         array_push($pages,array($uri,$uri));
    44.                     }
    45.                 }
    46.                 }
    47.             }
    48.         } catch (Exception $e) {
    49.             // There was a problem opening the directory
    50.         }
    51.         return $pages;
    52.     }
    53. }
    54.  
    55. // helper function to sort matched pages alphabetically by title
    56. function by_title($a,$b) {
    57.         return ($a[1] == $b[1]) ?
    58.                strcmp($a[0],$b[0]) :
    59.                ($a[1] > $b[1]);
    60. }
    61.  
    62. // SiteSearch object to do the searching
    63. $search = new SiteSearch();
    64.  
    65. // array to hold the pages that match the search term
    66. $matching_pages = array();
    67. // directories underneath the document root to search
    68. $search_dirs = array('sports','movies','food');
    69. // regular expression to use in searching files. The "S" pattern
    70. // modifier tells the PCRE engine to "study" the regex for greater
    71. // efficiency.
    72. $search->bodyRegex = '#<body>(.*' . preg_quote($_REQUEST['term'],'#').
    73.                      '.*)</body>#Sis';
    74.  
    75. // add the files that match in each directory to $matching pages
    76. foreach ($search_dirs as $dir) {
    77.     $matching_pages = array_merge($matching_pages,
    78.                                   $search->searchDir($_SERVER['DOCUMENT_ROOT'].'/'.$dir));
    79. }
    80.  
    81. if (count($matching_pages)) {
    82.     // sort the matching pages by title
    83.     usort($matching_pages,'by_title');
    84.     print '<ul>';
    85.     // print out each title with a link to the page
    86.     foreach ($matching_pages as $k => $v) {
    87.         print sprintf('<li> <a href="%s">%s</a>',$v[0],$v[1]);
    88.     }
    89.     print '</ul>';
    90. } else {
    91.     print 'No pages found.';
    92. }
    93. ?>
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Хорошо, если таких страничек 10-20 штук. Помоему, это просто пример работы с деревом ФС, а не руководство к действию.
     
  11. Blond

    Blond Активный пользователь

    С нами с:
    3 окт 2006
    Сообщения:
    87
    Симпатии:
    0
    пасибо всем, понравилась идея с БД. ща пытаюсь что то такое организавать.
     
  12. Blond

    Blond Активный пользователь

    С нами с:
    3 окт 2006
    Сообщения:
    87
    Симпатии:
    0
    да, кстати, вспомнил еще две небольшие трудности, которые у меня не получается решить:
    1. допустим есть таблица MySQL следующего вида -
    name |mail
    name1|mail1 |
    =========
    name2|mail2 |
    =========
    name3|mail3 |

    Допустим мне нужно извлечь все содержимое этой таблицы. Я занашу его в массив с помощью функции $r=mysql_fetch_array(). И тут у меня возникает проблема. Я не знаю как вывести содержимое этого массива на экран. Тоесть вывести все элементы первой строки таблицы я могу (print "{$r['name']}, {$r['email']}" - отображает name1, mail1), а вот как вывести все остальные строки не понимаю.

    и последний вопрос - в чем разница межды print u echo
     
  13. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    <?php
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    print "{$r['name']}, {$r['email']}";
    }
    ?>