Вход

Просмотр полной версии : Поиск одним файлом.


джагги на работе
28.01.2002, 19:37
Как поиск по сайту сделать одним файлом?
алгоритм какой?
[list=1]
смотрим какие папки есть
смотрим какие файлы есть в этих папках
открываем каждый файл и ищем в нем.
закрываем файл
выводим результат
[/list=1]

и как это сотворить ?????

der
29.01.2002, 00:06
http://www.php.net/manual/en/ref.dir.php

и


http://www.php.net/manual/en/ref.filesystem.php

Crazy
29.01.2002, 21:50
Если делать разумно, то задача делится на два куска:

1. Скрипт для создания поискового индекса.
2. Скрипт для поиска в этом индексе.

Формат индекса зависит от конкретных условий. Простейший вариант -- по строке на файл. Первое слово -- URL. Дальше через пробел -- встречающиеся в файле слова.

kolhoznik
29.01.2002, 22:17
www.atomz.com (http://www.atomz.com)


Alex

Crazy
29.01.2002, 22:22
Это действительно сделано на PHP? :D

kolhoznik
29.01.2002, 23:22
Можно и на PHP http://bombusbee.com/downloads/files/class.Atomz.zip



Alex

Crazy
29.01.2002, 23:31
"В подключении отказано"

kolhoznik
29.01.2002, 23:55
Кому и куда?


Alex

Crazy
30.01.2002, 00:01
FlashGet'у при заходе по указанной тобой ссылке.

Сейчас же вообще нет коннекте к указанному тобой сайту (ни во FlashGet, ни в IE).

kolhoznik
30.01.2002, 12:00
Странно, у меня все работает. А если по сути то это, не совсем ответ на вопрос, но может помочь. :)


Alex

Crazy
30.01.2002, 12:37
Скачал файл. Много смеялся. :D

джагги на работе
30.01.2002, 13:23
<?php

// Spectator's Indexing Script
// (C) Spectator.ru
// Для работы требуется PHP 4 или выше.
// Если вы будете использовать этот скрипт, ссылка на Spectator.ru крайне желательна. Спасибо.



// ставим скрипт "на счетчик" (чтобы знать, как долго он выполнялся
$ttt=microtime();
$ttt=((double)strstr($ttt, ' ')+(double)substr($ttt,0,strpos($ttt,' ')));


$indexdir="text"; #индексируемая директория
$indexfile="indexfile.txt"; #файл, в котором будет лежать индекс
// если вы хотите индексировать файлы в нескольких директориях, надо внести несколько махоньких добавлений...


// делаем так, чтобы не было таймаута из-за того, что скрипт будет долго выполняться (на всякий случай)
// и из-за того, что пользователь нажмет кнопку "стоп" в браузере
$abort = ignore_user_abort(1);
set_time_limit(600);

// Функция, удалающая слова, короче 3х букв. Пригодится дальше.
function sw (&$item1, $key) { if (strlen($item1)<3) $item1=""; }


// по очереди открываем все файлы в директории и проверяем, можно ли их индексировать
// у меня можно индексировать только файлы, которые имеют вид "число.txt"
// то есть && (is_numeric(str_replace (".txt","", $file))) - это вам наверняка не понадобится.

$handle=opendir('./'.$indexdir);
while (false!==($file = readdir($handle))):
if ($file != "." && $file != ".." && (is_numeric(str_replace (".txt","", $file))) ):




// открываем очередной файл
$fd = fopen ($indexdir."/".$file, "r");
$contents = fread ($fd, filesize ($indexdir."/".$file));
Fclose ($fd);


// убираем переводы строк
$contents=str_replace ("\n"," ", $contents);
$contents=str_replace ("\r","", $contents);


// убираем хтмл-тэги
$contents=str_replace ('<br>', ' ', $contents);
$contents=str_replace ('<p>', ' ', $contents);
$contents=strip_tags ($contents);


// убираем знаки препинания и цифры
// все эти строки работают быстрей, чем один eregi_replace!

$contents=str_replace (' -', ' ', $contents);
$contents=str_replace ('.', ' ', $contents);
$contents=str_replace (',', ' ', $contents);
$contents=str_replace ('!', ' ', $contents);
$contents=str_replace ('?', ' ', $contents);
$contents=str_replace (':', ' ', $contents);
$contents=str_replace (';', ' ', $contents);
$contents=str_replace (')', ' ', $contents);
$contents=str_replace ('(', ' ', $contents);
$contents=str_replace ('"', ' ', $contents);


// убираем заглавные буквы
$contents=strtolower ($contents);




// разбиваем на слова, убираем слова, короче 3х букв
$contents=explode (" ", $contents);
// вот и функция пригодилась...
array_walk ($contents, 'sw');


// убираем повторяющиеся слова
$contents=array_unique ($contents);


// соединяем слова
$contents=implode (" ", $contents);


// формируем соответствующую строку в индексе.
$fullfile.=$file."| ".$contents." \n";


// индекс-файл будет иметь вид:
// имя_файла|индекс_для_данного_файла \n
// имя_файла|индекс_для_данного_файла \n
// имя_файла|индекс_для_данного_файла \n


echo ($file." проиндексирован<br>");
// переходим к следующему файлу

endif;
endwhile;
closedir($handle);



// убираем двойные пробелы
while (stristr($fullfile, " ")) $fullfile=str_replace (" "," ",$fullfile);


// индекс готов, сохраняем его
$fp = fopen($indexfile, "w+");
fwrite($fp, $fullfile);
fclose($fp);


// считаем, как долго работал скрипт
$ddd=microtime();
$ddd=((double)strstr($ddd, ' ')+(double)substr($ddd,0,strpos($ddd,' ')));

echo ("<br>Время индексации: ".(number_format(($ddd-$ttt),3))." секунд<br>");
echo ("Размер индекса: ".(number_format((round ((filesize($indexfile))/1024)) , 0, ".",".")))." Kb";
?>

<?php

// Spectator's Site Search Script
// (C) Spectator.ru
// Для работы требуется PHP 4 или выше.
// Если вы будете использовать этот скрипт, ссылка на Spectator.ru крайне желательна. Спасибо.


// файл с индексом
$indexfile="indexfile.txt";

// обрабатываем запрос

$total=0;
$qu2=str_replace ("+","&",$words);

// убираем заглавные буквы
$qu2=strtolower ($qu2);

// обрубаем в конце лишние пробелы
$qu2=chop($qu2);

// убираем двойные пробелы
while (stristr($qu2," ")) $qu2=str_replace (" "," ",$qu2);


echo ('Запрос: '.$qu2);
echo ('<p><p><p>');

// разбиваем запрос на слова
$words = explode (' ', $qu2);

// удаляем в запросе все лишнее (знаки препинания, и прочее)
$qu2=eregi_replace ('[.?,!()#":;|]', '', $qu2);

// проверяем длинну запроса
if (strlen($qu2)>2):


// открываем индекс
$index=file ($indexfile);
$num= (count($index)-1);

// для каждой сточки из индекса (одна строчка=один файл) выполняем:
for ($i=1; $i<$num+2; $i++):



$contents=$index[$i-1];


$wordcount =0;
$mustfound=1;


// выполняем для каждого их запрошенных слов:
$mustntfound=1;

for ($q=0; $q<count($words); $q++):


// обработка знаков *, + и -

// знак *
if (stristr($words[$q], "*")) {$search=str_replace ("*","",$words[$q]); } else { $search=" ".$words[$q]." ";}

// если в слове есть звездочка, то убираем звездочку и добавляем в начало и конец слова по пробелу
// если нет проблелов, то слово будет искаться не целиком, а "вообще",
// то есть на запрос "чай" будет выводиться и слово "случайный".

// bug: скрипт не учитывает, где в слове стоит звездочка и считает, что в любом случае она стоит в конце (!!)


// знак & (или +)
if (stristr($search, "&")) {$search=str_replace ("&","",$search); $mustfound++; }

// если стоит знак +, то количество слов, которые _должны_ быть найдены, увеличиваются на 1


// знак -
if (stristr($search, "-")) {$search=str_replace ("-","",$search); $mustntfound=0; }

// если стоит знак +, то если слово найдено, весь результат умножается на 0 (смотри дальше).



// если слово найдено, считаем его и умножаем на $mustntfound, то есть на 1,
// если найдено "правильное" слово и на 0, если найдено слово, помеченное знаком -

if (stristr($contents, $search)) { $wordcount++; $wordcount=$wordcount*$mustntfound;}

endfor;




// проверяем, все ли слова, помеченные знаком + найдены,
// либо (если таких слов нет), найдено ли вообще хоть одно слово

if ($wordcount >= $mustfound):

// находим имя файла, в котором это найдено
$file=explode ("|",$contents);
$file=$file[0];


// выводим имя файла, в котором это найдено с ссылкой
// (этот кусочек вам надо будет переделать под собственные нужды).

$file=str_replace (".txt", "", $file);
$file=str_replace ("_", ".", $file);
echo ("<a href=".$file.">".$file."</a><br>");


// считаем, колько всего файлов надено
$total++;

endif;




// переходим к следующемуу файлу
endfor;


// выводим результаты
if ($total!=0) echo ('<br><br>Всего найдено страниц: '.$total); else echo ("<b>Ничего не найдено!</b><p>Возможно, вы просто не правильно составили запрос. Как это сделать правильно - смотрите <a href=search>вот здесь</a>.");



else:
echo ("<br>Слишком короткий запрос!");
endif;


?>


<!-- Форма для поиска: -->
<form method=get action=search.php>
<input type=text size=19 name=words value="" maxlength=150>&nbsp;<input type=submit class=frm value=Go>
</form>