сайт мой. Написан в основном на html с добавлением простеньких алгоритмиков на php. В нем получилось много страниц (<200) и я подумал, что бы ло бы не плохо организовать поиск, ну что бы посетителям меньше мароки было.
Перенес. Не в блондинок, заметьте, не в блондинок! Сложный вопрос. Неопределенный. Расскажи подроблнее, как у тебя организован сайт технически.
Как повод для размышлений могу такое предложить... Просто каждую страницу запихивать в массив и вырезая теги хтмл и все пхп выполнять поиск необходимого. Если совпадение найдено, то тогда заносить данную страницу ( ее название ) в другой массив или в таблицу бд. И такое проводить с каждой страницей. Если организовать это все в один поток, то будет долго а вот если в несколько
Если есть БД - имхо так же, все страницы занести в БД, создать табличку для кеша, в нее при поиске в страницах заносить время поиска, слово и номера найденых страниц. Таким образом повторным поиском можно сначала выуживать если в кеше поиск по этому слову и не состарился он на 6 часов (ну или сколько там кеш храниться будет, если статика - можно вообще кеш обнулять вручную после модификации сайта). Ну а если данных нет в кеше - искать. Если БД нет - плохо Сделать тот же кеш найденых номеров страниц в файл. Один файл - один поиск, в качестве имени можно взять md5(strlower(Поиск)).".txt". Даже быстрее местами будет - есть файл - есть кеш, нет файла - будем тормозить и делать полный поиск
Можно использовать полноконтекстовый поиск, который предоставляет MySQL в таблицах типа MyISAM. Тогда всё что нужно будет сделать: 1) Просканировать сайт, собрать список всех страниц. 2) Записать полученные данные со страниц в БД или лучше записать собственно сам контент без лишнего оформления, предварительно вырезвав HTML тэги.
Можно воспользовать чужим творением. Их немало и скриптом с использованием БД и без нею. Один из них здесь http://www.internet-technologies.ru/scripts/script_51.html. Сам не тестил.
Пример программы поиск по сайту из книги "PHP. Рецепты программирования." Скляр, Трахтенберг: "Программа ищет указанный терм (хранящийся в $_REQUEST['term']) во всех файлах указанного множества каталогов под корнем документа. Эти каталоги перечислены в переменной $search_dirs. Она рекурсивно заходит в подкаталоги и следует по символьным ссылкам, но при этом отслеживает просмотренные файлы и каталоги, чтобы не войти в бесконечный цикл." PHP: <?php class SiteSearch { public $bodyRegex = ''; protected $seen = array(); public function searchDir($dir) { // array to hold pages that match $pages = array(); // array to hold directories to recurse into $dirs = array(); // mark this directory as seen so we don't look in it again $this->seen[realpath($dir)] = true; try { foreach (new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir)) as $file) { if ($file->isFile() && $file->isReadable() && (! isset($this->seen[$file->getPathname()]))) { // mark this as seen so we skip it // if we come to it again $this->seen[$file->getPathname()] = true; // load the contents of the file into $text $text = file_get_contents($file->getPathname()); // if the search term is inside the body delimiters if (preg_match($this->bodyRegex,$text)) { // construct the relative URI of the file by removing // the document root from the full path $uri = substr_replace($file->getPathname(),'',0,strlen ($_SERVER['DOCUMENT_ROOT'])); // if the page has a title, find it if (preg_match('#<title>(.*?)</title>#Sis',$text,$match)) { // and add the title and URI to $pages array_push($pages,array($uri,$match[1])); } else { // otherwise use the URI as the title array_push($pages,array($uri,$uri)); } } } } } catch (Exception $e) { // There was a problem opening the directory } return $pages; } } // helper function to sort matched pages alphabetically by title function by_title($a,$b) { return ($a[1] == $b[1]) ? strcmp($a[0],$b[0]) : ($a[1] > $b[1]); } // SiteSearch object to do the searching $search = new SiteSearch(); // array to hold the pages that match the search term $matching_pages = array(); // directories underneath the document root to search $search_dirs = array('sports','movies','food'); // regular expression to use in searching files. The "S" pattern // modifier tells the PCRE engine to "study" the regex for greater // efficiency. $search->bodyRegex = '#<body>(.*' . preg_quote($_REQUEST['term'],'#'). '.*)</body>#Sis'; // add the files that match in each directory to $matching pages foreach ($search_dirs as $dir) { $matching_pages = array_merge($matching_pages, $search->searchDir($_SERVER['DOCUMENT_ROOT'].'/'.$dir)); } if (count($matching_pages)) { // sort the matching pages by title usort($matching_pages,'by_title'); print '<ul>'; // print out each title with a link to the page foreach ($matching_pages as $k => $v) { print sprintf('<li> <a href="%s">%s</a>',$v[0],$v[1]); } print '</ul>'; } else { print 'No pages found.'; } ?>
Хорошо, если таких страничек 10-20 штук. Помоему, это просто пример работы с деревом ФС, а не руководство к действию.
да, кстати, вспомнил еще две небольшие трудности, которые у меня не получается решить: 1. допустим есть таблица MySQL следующего вида - name |mail name1|mail1 | ========= name2|mail2 | ========= name3|mail3 | Допустим мне нужно извлечь все содержимое этой таблицы. Я занашу его в массив с помощью функции $r=mysql_fetch_array(). И тут у меня возникает проблема. Я не знаю как вывести содержимое этого массива на экран. Тоесть вывести все элементы первой строки таблицы я могу (print "{$r['name']}, {$r['email']}" - отображает name1, mail1), а вот как вывести все остальные строки не понимаю. и последний вопрос - в чем разница межды print u echo
<?php while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { print "{$r['name']}, {$r['email']}"; } ?>