Поиск по сайту. Варианты реализации.
Другой вопрос в том, что скрипт который они дают http://xml.yandex.ru/games/site-search.html вопще какой-то сплав пхп и неизвестно чего. Можт кто нить подскажет нормальный пхп скрипт яндекс-поиска?
На правах рекламы: http://www.cn-software.com/cnsearch_pro/rus/
Сайт написан на пхп, пхп и хтмл код не разделён, cgi доступно. Вначале надо рассмотреть все бесплатные возможности реализации поиска.
2. Посмотри: htdig, aspseek и [phpdoc]mnogosearch[/phpdoc]
2Dennn: на самом деле это всего-лишь пример. Ты волен написать подобное даже на бейсике. Просто Яндекс так любезен, что показывает на примере Perl, как с ним правильно общаться.
Это хорошо, что Яндекс так любезен, но я уверен, что уже есть готовые решения как обратится к Яндексу посредством пхп, зачем заново изобретать велосипед?! Тем более, что я этой всей кухни Яндекса не знаю(необходимые библиотеки, если есть, количество и имена переменных и т.д.)
Самое правильное делать индекс всех встречающихся слов и раскладывать их по полкам, где и сколько раз встречаются (так же сделано и на этом форуме). И искать уже по этим индексам. Конечно, это отличается от Яндекса с его семантическим поиском, но никто же не запрещает трудится над этим дальше...
Спасибо, конечно за советы, но писать свой поиск я не собираюсь, это долго и в итоге получится велосипед который намного хуже уже изобретённого. Мне нужно готовое решение, которых масса. Разве никто не поможет? Просто скрипт, обращающицся к любой поисковой службе, который можно интегрировать в свой дизайн и всё!!!
Цитата: Dennn
Спасибо, конечно за советы, но писать свой поиск я не собираюсь, это долго и в итоге получится велосипед который намного хуже уже изобретённого. Мне нужно готовое решение, которых масса. Разве никто не поможет? Просто скрипт, обращающицся к любой поисковой службе, который можно интегрировать в свой дизайн и всё!!!
Во. Вот это - ласапет. Вот скрипт, обращающийся к поисковой службе и его можно интегрировать в дизайн: http://xml.yandex.ru/games/site-search.html
Спасибо, хороший прикол, 5 баллов. Но мне нужен пхп ане перл, в перле я не бум бум. Плюс здесь идёт обращение к библиотекам, которые должны размещаться на сервере сайта.
хм....странно, мне тоже самое нужно....
ничего странного, поиск каждому сайту нужен!
тэк....эт indexer.php
Код:
error_reporting(0);
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$start_time = "$secs.$microsecs";
$handle = opendir('.');
$input = '';
$sizetottal = 0;
while(($namefile=readdir($handle))!=false)
{
if(eregi("[a-zA-Z0-p_-]*.txt", $namefile) or
eregi("[a-zA-Z0-p_-]*.inc", $namefile) or
eregi("[a-zA-Z0-p_-]*.htaccess", $namefile))
{
continue;
}
elseif(eregi("[a-zA-Z0-p_-]*.php", $namefile) or
eregi("[a-zA-Z0-p_-]*.html", $namefile) or
eregi("[a-zA-Z0-p_-]*.htm", $namefile))
{
$size = filesize($namefile);
$size = $size / 1024;
$size = round($size, 1);
$sizetotal += $size;
$namefile = strtolower(trim($namefile));
$FILE = file($namefile);
$text = implode(" ", $FILE);
$text = strip_tags($text);
$text = preg_replace("/[><]\"] + /", " ", $text);
$text = preg_replace("/[\s,] + /", " ", strtolower($text));
$text = wordwrap($text, 80, "|");
$input .= "<a href=".$namefile." target=_new>".$namefile."</a>";
$input .= "@@".$text."\r\n";
}
}
$fp = fopen("search.dat", "w");
fputs($fp, $input);
fclose($fp);
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$end_time = "$secs.$microtime";
$total = round(($end_time - $start_time), 2);
echo '<center> Индексный файл обновлен. <br/>Всего обработано '.$sizetotal.'kB';
echo ' За '.$total.' секунд <br/> <a href=form.php>Проверить возможности поиска</a>';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$start_time = "$secs.$microsecs";
$handle = opendir('.');
$input = '';
$sizetottal = 0;
while(($namefile=readdir($handle))!=false)
{
if(eregi("[a-zA-Z0-p_-]*.txt", $namefile) or
eregi("[a-zA-Z0-p_-]*.inc", $namefile) or
eregi("[a-zA-Z0-p_-]*.htaccess", $namefile))
{
continue;
}
elseif(eregi("[a-zA-Z0-p_-]*.php", $namefile) or
eregi("[a-zA-Z0-p_-]*.html", $namefile) or
eregi("[a-zA-Z0-p_-]*.htm", $namefile))
{
$size = filesize($namefile);
$size = $size / 1024;
$size = round($size, 1);
$sizetotal += $size;
$namefile = strtolower(trim($namefile));
$FILE = file($namefile);
$text = implode(" ", $FILE);
$text = strip_tags($text);
$text = preg_replace("/[><]\"] + /", " ", $text);
$text = preg_replace("/[\s,] + /", " ", strtolower($text));
$text = wordwrap($text, 80, "|");
$input .= "<a href=".$namefile." target=_new>".$namefile."</a>";
$input .= "@@".$text."\r\n";
}
}
$fp = fopen("search.dat", "w");
fputs($fp, $input);
fclose($fp);
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$end_time = "$secs.$microtime";
$total = round(($end_time - $start_time), 2);
echo '<center> Индексный файл обновлен. <br/>Всего обработано '.$sizetotal.'kB';
echo ' За '.$total.' секунд <br/> <a href=form.php>Проверить возможности поиска</a>';
кроче тут фичя такая, что вначале мы все закидываем в файл .dat шоб легче искалось....
Собстно
phprusearch.php
Код:
require('inc/header.php');
require('sconfig.php');
?>
<table width="90%">
<tr>
<td width="10%">
<b>Поиск: </b>
</td>
<td align="left" valign="top">
<?php
$query = $_POST["query"];
echo $query;
?>
</td>
</tr>
<tr>
<td colspan="2">
<?php
$fp = fopen("search.dat", "r");
$count = 0;
$start_query;
$end_anchor;
$anchor;
$found = false;
while(!feof($fp))
{
$str = fgets($fp);
if($end_anchor=strpos($str, "@@"))
{
$count=0;
$anchor = substr($str, 0, $end_anchor);
// echo $anchor."<br/>";
}
if($start_query=strpos($str, $query))
{
if($count == 0)
{
echo "Найдено в ".$anchor."<br/>";
echo "<font color=".$COLOR.">".$str."</font><br/>";
$count++;
}
}
}
fclose($fp);
?>
</td>
</tr>
</table>
<?php
require('inc/footer.php');
require('sconfig.php');
?>
<table width="90%">
<tr>
<td width="10%">
<b>Поиск: </b>
</td>
<td align="left" valign="top">
<?php
$query = $_POST["query"];
echo $query;
?>
</td>
</tr>
<tr>
<td colspan="2">
<?php
$fp = fopen("search.dat", "r");
$count = 0;
$start_query;
$end_anchor;
$anchor;
$found = false;
while(!feof($fp))
{
$str = fgets($fp);
if($end_anchor=strpos($str, "@@"))
{
$count=0;
$anchor = substr($str, 0, $end_anchor);
// echo $anchor."<br/>";
}
if($start_query=strpos($str, $query))
{
if($count == 0)
{
echo "Найдено в ".$anchor."<br/>";
echo "<font color=".$COLOR.">".$str."</font><br/>";
$count++;
}
}
}
fclose($fp);
?>
</td>
</tr>
</table>
<?php
require('inc/footer.php');
ну там еще в конфиграционном файлике можно указать каким цветом будет посвечиваться, стиль, и по сколько строчек выводить.....
[COLOR=darkred]======================[/COLOR]
[COLOR=darkred]Для кода PHP есть соответствующие типа тэги[/COLOR]
indexer.php
Код:
<?
error_reporting(0);//Не выдаввать военные тайны
//Тэкс....тут у нас время
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$start_time = "$secs.$microsecs";
//Открываемся
$handle = opendir('.');
$input = '';
while (($namefile = readdir($handle))!==false)
{
// Не хочу обрабатывать сие добро
if (eregi("[a-zA-Z0-p_-]*.txt",$namefile) or
eregi("[a-zA-Z0-p_-]*.inc",$namefile) or
eregi("[a-zA-Z0-p_-]*.htaccess",$namefile))
{ continue; }
// а вот это может буду
elseif(eregi("[a-zA-Z0-p_-]*.php",$namefile) or
eregi("[a-zA-Z0-p_-]*.php3",$namefile) or
eregi("[a-zA-Z0-p_-]*.htm",$namefile) or
eregi("[a-zA-Z0-p_-]*.html",$namefile) or
eregi("[a-zA-Z0-p_-]*.phtml",$namefile))
{ // размер конкретного файла
$size=filesize($namefile); $size=($size/1024);
$size=round($size,1);
// общий размер обработанных данных
$sizetotal += $size;
$namefile=strtolower(trim($namefile)); // имя конкретного файла
$FILE = file($namefile);
$text = implode(" ",$FILE);
//Режем режем режем
$text = strip_tags($text);
$text = preg_replace("/[><\'\"]+/"," ",$text);
$text = preg_replace ("/[\s,]+/", " ", strtolower($text));
// разбиваем текст файла на короткие участки, ну скажем символов по 80
// это примерно 8-12 слов
$text = wordwrap ($text, 80, "|");
$input .= "<A HREF='".$namefile."' TARGET=_new>".$namefile.'</A>';
$input .= "::".$size."::".$text."\r\n";
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$fp = fopen("search.dat","w+");
# flock($fp,LOCK_SH );
fputs ($fp, $input);
# flock($fp,LOCK_UN );
fclose($fp);
echo '<CENTER>IS REFRESHED!!!!!!!<BR><BR>ME GOTOV!!!!!<BR><BR>ALL '.$sizetotal.'Kb';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$end_time = "$secs.$microsecs";
$total = round(($end_time - $start_time),2);
echo " за $total сек. <BR><BR><A HREF=form.php>PROVERIT'?</A>";
?>
error_reporting(0);//Не выдаввать военные тайны
//Тэкс....тут у нас время
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$start_time = "$secs.$microsecs";
//Открываемся
$handle = opendir('.');
$input = '';
while (($namefile = readdir($handle))!==false)
{
// Не хочу обрабатывать сие добро
if (eregi("[a-zA-Z0-p_-]*.txt",$namefile) or
eregi("[a-zA-Z0-p_-]*.inc",$namefile) or
eregi("[a-zA-Z0-p_-]*.htaccess",$namefile))
{ continue; }
// а вот это может буду
elseif(eregi("[a-zA-Z0-p_-]*.php",$namefile) or
eregi("[a-zA-Z0-p_-]*.php3",$namefile) or
eregi("[a-zA-Z0-p_-]*.htm",$namefile) or
eregi("[a-zA-Z0-p_-]*.html",$namefile) or
eregi("[a-zA-Z0-p_-]*.phtml",$namefile))
{ // размер конкретного файла
$size=filesize($namefile); $size=($size/1024);
$size=round($size,1);
// общий размер обработанных данных
$sizetotal += $size;
$namefile=strtolower(trim($namefile)); // имя конкретного файла
$FILE = file($namefile);
$text = implode(" ",$FILE);
//Режем режем режем
$text = strip_tags($text);
$text = preg_replace("/[><\'\"]+/"," ",$text);
$text = preg_replace ("/[\s,]+/", " ", strtolower($text));
// разбиваем текст файла на короткие участки, ну скажем символов по 80
// это примерно 8-12 слов
$text = wordwrap ($text, 80, "|");
$input .= "<A HREF='".$namefile."' TARGET=_new>".$namefile.'</A>';
$input .= "::".$size."::".$text."\r\n";
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$fp = fopen("search.dat","w+");
# flock($fp,LOCK_SH );
fputs ($fp, $input);
# flock($fp,LOCK_UN );
fclose($fp);
echo '<CENTER>IS REFRESHED!!!!!!!<BR><BR>ME GOTOV!!!!!<BR><BR>ALL '.$sizetotal.'Kb';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$end_time = "$secs.$microsecs";
$total = round(($end_time - $start_time),2);
echo " за $total сек. <BR><BR><A HREF=form.php>PROVERIT'?</A>";
?>
Вначале идет индексация в файлик....(тип шоб проще было)
phprusaerch.php
Код:
?
require ('inc/header.php'); // шапка документа
require ('sconfig.php'); // файл конфигурации
?>
<TABLE BORDER=0 WIDTH=95%>
<TR><TD>
Вы искали: <B>
<!-- Собственно сам скрипт поиска -->
<?
$query=$_POST['query'];
if (isset($query))
{
echo htmlspecialchars(trim($query)).'</B></CENTER>';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$start_time = "$secs.$microsecs";
$sizetotal = 0;
if ( ereg ( "[><?]+", $query, $error_1 ))
{
echo '<BR>ERROR in SEARCH!!!!! - ( <FONT COLOR=RED>'.htmlspecialchars($error_1[0]).'</FONT> )<BR><BR>';
exit;
}
if (strlen(trim($query)) < 1)
{
echo '<BR>ITS TOO SHORT!!!!!<BR><BR>';
exit;
}
$searchstring = strtolower(trim($query));
$searchword = explode (" ",$searchstring); // массив строки запроса
$allwords = count($searchword); // сколько слов в запросе
##################################################################
$FILE = file('search.dat');
$count = count($FILE);
for ($x = 0; $x < $count; $x++) // выбираем файл
{
list($filename,$filesize,$content) = explode("::",$FILE[$x],3);
$temp = explode("|",$content);
$strok = $true = $find = $full_result = $long = 0;
$sizetotal += $filesize;
// Строчка
foreach($temp as $key => $value)
{
// более одного слова
if($allwords > 1)
{
$new = ereg_replace($searchstring,"<FONT COLOR=".$COLOR.">".$STYLE.$searchstring."</FONT>".$ENDSTYLE,$value);
if($new != $value)
{
$find++;
$true = 1;
$show[$find] = $new;
$full_result++;
}
}
// по каждому из слов
for ($all = 0; $all < $allwords; $all++)
{
$chekfull = explode(" ",$value);
if(in_array($searchword[$all],$chekfull))
$full_result++;
$long = strlen($searchword[$all]);
if ($long > 5)
{
if(preg_match("/(у|ы|а|о|я|е|и)$/", $searchword[$all]))
$long = -1;
//Парам тут Окончаница!!!!!!!+>
if(preg_match("/(ие|ия|ем|им|ию|ий|ии|ой|ов|ам|их|ый|ых|ая|ай|ае|ую)$/", $searchword[$all]))
$long = -2;
$short = substr($searchword[$all],0,$long);
$new = ereg_replace($short, "<FONT COLOR=".$COLOR.">".$STYLE.$short."</FONT>".$ENDSTYLE, $value);
if($new != $value)
{
$find++;
$true = 1;
$show[$find] = $new;
}
}
else
{
$short = $searchword[$all];
$new = ereg_replace($searchword[$all], "<FONT COLOR=".$COLOR.">".$STYLE.$searchword[$all]."</FONT>".$ENDSTYLE, $value);
if($new != $value)
{
$find++;
$true = 1;
$show[$find] = $new;
}
}
}
}
if ($true !== 0)
{
$fulltrue = 1;
echo '<BR><BR><B>файл '.$filename.', размeр - '.$filesize.'Kb</B><BR> найдено '.$find.' совпадений ( точных - '.$full_result.', похожих - '.($find-$full_result).')<BR>среди них такие как:';
if ($find > $STROK) // ограничение количества выводимых строк
$strok = $STROK;
else
$strok = $find;
for ($a = 1; $a < $strok+1; $a++) // выводим совпадения построчно
{
echo '<LI>...'.$show[$a].'...</LI>';
}
}
}
if(!isset($fulltrue))
echo '<BR>FIND IS NOthing';
echo '<BR><BR><CENTER>OBRABOTANO '.$sizetotal.'Kb in '.$count.' Files ';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$end_time = "$secs.$microsecs";
$total = round(($end_time - $start_time),2);
echo " за $total сек. <BR><BR>";
}
else
echo 'Nothing<BR><BR><CENTER>';
?>
</TD></TR>
</TABLE>
<? require ('inc/footer.php') ?>
require ('inc/header.php'); // шапка документа
require ('sconfig.php'); // файл конфигурации
?>
<TABLE BORDER=0 WIDTH=95%>
<TR><TD>
Вы искали: <B>
<!-- Собственно сам скрипт поиска -->
<?
$query=$_POST['query'];
if (isset($query))
{
echo htmlspecialchars(trim($query)).'</B></CENTER>';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$start_time = "$secs.$microsecs";
$sizetotal = 0;
if ( ereg ( "[><?]+", $query, $error_1 ))
{
echo '<BR>ERROR in SEARCH!!!!! - ( <FONT COLOR=RED>'.htmlspecialchars($error_1[0]).'</FONT> )<BR><BR>';
exit;
}
if (strlen(trim($query)) < 1)
{
echo '<BR>ITS TOO SHORT!!!!!<BR><BR>';
exit;
}
$searchstring = strtolower(trim($query));
$searchword = explode (" ",$searchstring); // массив строки запроса
$allwords = count($searchword); // сколько слов в запросе
##################################################################
$FILE = file('search.dat');
$count = count($FILE);
for ($x = 0; $x < $count; $x++) // выбираем файл
{
list($filename,$filesize,$content) = explode("::",$FILE[$x],3);
$temp = explode("|",$content);
$strok = $true = $find = $full_result = $long = 0;
$sizetotal += $filesize;
// Строчка
foreach($temp as $key => $value)
{
// более одного слова
if($allwords > 1)
{
$new = ereg_replace($searchstring,"<FONT COLOR=".$COLOR.">".$STYLE.$searchstring."</FONT>".$ENDSTYLE,$value);
if($new != $value)
{
$find++;
$true = 1;
$show[$find] = $new;
$full_result++;
}
}
// по каждому из слов
for ($all = 0; $all < $allwords; $all++)
{
$chekfull = explode(" ",$value);
if(in_array($searchword[$all],$chekfull))
$full_result++;
$long = strlen($searchword[$all]);
if ($long > 5)
{
if(preg_match("/(у|ы|а|о|я|е|и)$/", $searchword[$all]))
$long = -1;
//Парам тут Окончаница!!!!!!!+>
if(preg_match("/(ие|ия|ем|им|ию|ий|ии|ой|ов|ам|их|ый|ых|ая|ай|ае|ую)$/", $searchword[$all]))
$long = -2;
$short = substr($searchword[$all],0,$long);
$new = ereg_replace($short, "<FONT COLOR=".$COLOR.">".$STYLE.$short."</FONT>".$ENDSTYLE, $value);
if($new != $value)
{
$find++;
$true = 1;
$show[$find] = $new;
}
}
else
{
$short = $searchword[$all];
$new = ereg_replace($searchword[$all], "<FONT COLOR=".$COLOR.">".$STYLE.$searchword[$all]."</FONT>".$ENDSTYLE, $value);
if($new != $value)
{
$find++;
$true = 1;
$show[$find] = $new;
}
}
}
}
if ($true !== 0)
{
$fulltrue = 1;
echo '<BR><BR><B>файл '.$filename.', размeр - '.$filesize.'Kb</B><BR> найдено '.$find.' совпадений ( точных - '.$full_result.', похожих - '.($find-$full_result).')<BR>среди них такие как:';
if ($find > $STROK) // ограничение количества выводимых строк
$strok = $STROK;
else
$strok = $find;
for ($a = 1; $a < $strok+1; $a++) // выводим совпадения построчно
{
echo '<LI>...'.$show[$a].'...</LI>';
}
}
}
if(!isset($fulltrue))
echo '<BR>FIND IS NOthing';
echo '<BR><BR><CENTER>OBRABOTANO '.$sizetotal.'Kb in '.$count.' Files ';
$microtime = microtime();
$microsecs = substr($microtime, 2, 8);
$secs = substr($microtime, 11);
$end_time = "$secs.$microsecs";
$total = round(($end_time - $start_time),2);
echo " за $total сек. <BR><BR>";
}
else
echo 'Nothing<BR><BR><CENTER>';
?>
</TD></TR>
</TABLE>
<? require ('inc/footer.php') ?>
а тут настроечки..типа по сколько строчечек выводить, и прочее...
sconfig.php
Код:
<?
$STROK = 6;
$COLOR = 'RED';
$STYLE = '<I>';
$ENDSTYLE = '</B>';
?>
$STROK = 6;
$COLOR = 'RED';
$STYLE = '<I>';
$ENDSTYLE = '</B>';
?>
Сразу говорю, я не умный.....Лаба такая попалась.....
To Padsh поисковик в принципе написан по логике, но он работает с текстом который в файлах, а если у нас например news.php модуль новостной ленты и вся инфа в базе, то он не произведёт поиск по новостям.
ну что есть...с БД не работал....