Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск по сайту. Варианты реализации.

10K
08 декабря 2006 года
Dennn
46 / / 23.08.2006
В общем есть такая задача. Один из вариантов решения использовать Яндекс-поиск посредством хмл запросов, Яндекс разрешает бесплатно это делать но не более 1000 запросов в день, этого хватит.
Другой вопрос в том, что скрипт который они дают http://xml.yandex.ru/games/site-search.html вопще какой-то сплав пхп и неизвестно чего. Можт кто нить подскажет нормальный пхп скрипт яндекс-поиска?
4
08 декабря 2006 года
mike
3.7K / / 01.10.2002
Вообще-то это Perl.
На правах рекламы: http://www.cn-software.com/cnsearch_pro/rus/
10K
08 декабря 2006 года
Dennn
46 / / 23.08.2006
Сайт написан на пхп, пхп и хтмл код не разделён, cgi доступно. Вначале надо рассмотреть все бесплатные возможности реализации поиска.
4
08 декабря 2006 года
mike
3.7K / / 01.10.2002
1. Попробуй использовать MySql с его fulltext индексами
2. Посмотри: htdig, aspseek и [phpdoc]mnogosearch[/phpdoc]
8
09 декабря 2006 года
mfender
3.5K / / 15.06.2005
2Dennn: на самом деле это всего-лишь пример. Ты волен написать подобное даже на бейсике. Просто Яндекс так любезен, что показывает на примере Perl, как с ним правильно общаться.
10K
11 декабря 2006 года
Dennn
46 / / 23.08.2006
Это хорошо, что Яндекс так любезен, но я уверен, что уже есть готовые решения как обратится к Яндексу посредством пхп, зачем заново изобретать велосипед?! Тем более, что я этой всей кухни Яндекса не знаю(необходимые библиотеки, если есть, количество и имена переменных и т.д.)
8
11 декабря 2006 года
mfender
3.5K / / 15.06.2005
Самое правильное делать индекс всех встречающихся слов и раскладывать их по полкам, где и сколько раз встречаются (так же сделано и на этом форуме). И искать уже по этим индексам. Конечно, это отличается от Яндекса с его семантическим поиском, но никто же не запрещает трудится над этим дальше...
10K
11 декабря 2006 года
Dennn
46 / / 23.08.2006
Спасибо, конечно за советы, но писать свой поиск я не собираюсь, это долго и в итоге получится велосипед который намного хуже уже изобретённого. Мне нужно готовое решение, которых масса. Разве никто не поможет? Просто скрипт, обращающицся к любой поисковой службе, который можно интегрировать в свой дизайн и всё!!!
8
11 декабря 2006 года
mfender
3.5K / / 15.06.2005
Цитата: Dennn
Спасибо, конечно за советы, но писать свой поиск я не собираюсь, это долго и в итоге получится велосипед который намного хуже уже изобретённого. Мне нужно готовое решение, которых масса. Разве никто не поможет? Просто скрипт, обращающицся к любой поисковой службе, который можно интегрировать в свой дизайн и всё!!!


Во. Вот это - ласапет. Вот скрипт, обращающийся к поисковой службе и его можно интегрировать в дизайн: http://xml.yandex.ru/games/site-search.html

10K
11 декабря 2006 года
Dennn
46 / / 23.08.2006
Спасибо, хороший прикол, 5 баллов. Но мне нужен пхп ане перл, в перле я не бум бум. Плюс здесь идёт обращение к библиотекам, которые должны размещаться на сервере сайта.
16K
11 декабря 2006 года
Padsh
34 / / 10.12.2006
хм....странно, мне тоже самое нужно....
10K
11 декабря 2006 года
Dennn
46 / / 23.08.2006
ничего странного, поиск каждому сайту нужен!
16K
12 декабря 2006 года
Padsh
34 / / 10.12.2006
думаешь?....вот моему соседу алкашу, вртя ли.....а вообще наброски есть.....Только до ума довести....ПХП

тэк....эт 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>';



кроче тут фичя такая, что вначале мы все закидываем в файл .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');


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

[COLOR=darkred]======================[/COLOR]
[COLOR=darkred]Для кода PHP есть соответствующие типа тэги[/COLOR]
16K
14 декабря 2006 года
Padsh
34 / / 10.12.2006
Дамы и Гаспада, относительно доделанный поиск....
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>";
?>


Вначале идет индексация в файлик....(тип шоб проще было)

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') ?>


а тут настроечки..типа по сколько строчечек выводить, и прочее...
sconfig.php

Код:
<?


$STROK = 6;


$COLOR = 'RED';


$STYLE = '<I>';


$ENDSTYLE = '</B>';

?>


Сразу говорю, я не умный.....Лаба такая попалась.....
10K
14 декабря 2006 года
Dennn
46 / / 23.08.2006
To Padsh поисковик в принципе написан по логике, но он работает с текстом который в файлах, а если у нас например news.php модуль новостной ленты и вся инфа в базе, то он не произведёт поиск по новостям.
16K
15 декабря 2006 года
Padsh
34 / / 10.12.2006
ну что есть...с БД не работал....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог