Скрипт поисковой системы, типа yandex

Реально открыть свой поисковик для отдельной страны?

  • Да

    Голосов: 4 40,0%
  • Нет

    Голосов: 2 20,0%
  • Сложно

    Голосов: 4 40,0%
  • Легко

    Голосов: 0 0,0%

  • Всего проголосовало
    10
  • Опрос закрыт .
Статус
В этой теме нельзя размещать новые ответы.
кто им будет пользоваться то, если все юзают либо яшу либо гугл
Дык в том и прикол, что заказан поисковик НЕ ПО ВСЕЙ СЕТКЕ, а ИМЕННО ПО ОДНОЙ СТРАНЕ..
Да уже нашел решение и сделал, так что тема закрыта..Указывать ссылку на пример не буду, так как во-первых получится реклама, а во вторых заказчик сам не хочет...

Добавлено через 36 минут
Самый нормальный опенсорсный движек поисковика (имхо) - это Sphider. Правда он не решит задачу с конкректно казахстанскими сайтами, т.к. в него нужно добавлять сайты самому. Но зато у него алгаритм поиска довольно не плохой. Он на пхп, использует мускл. Если его немного доработать (он начинает долго думать когда проиндексированно около 500 сайтов), то получится крутой поисковик.

Все оказалось гораздо проще..Взял скрипт Каталог фирм и организаций, немного его подогнал под требования заказчика.Потом курьеры заказчика по почте и ножками оповестили все более-менее значимые конторы Казахстана о том, что открыт НОВЫЙ ПОИСКОВИК :) по СТРАНЕ.. И пока информация в него добавляется БЕСПЛАТНО..На это магическое слово клюнуло около 90% фирм..Личные странички заказчику нафиг не нужны, а по остальным ВЕБ - сайтам разослали предложение зарегиться на поисковике за 1 бакс.. Ну т.е. заплатили за регистрацию админам помалеху..И УСЕ :)НОвый поисковик готов..Вот такие вот пироги..Лано страна небольшая - все у них получилось и все довольны.. :)
 
Дык в том и прикол, что заказан поисковик НЕ ПО ВСЕЙ СЕТКЕ, а ИМЕННО ПО ОДНОЙ СТРАНЕ..
Да уже нашел решение и сделал, так что тема закрыта..Указывать ссылку на пример не буду, так как во-первых получится реклама, а во вторых заказчик сам не хочет...

Добавлено через 36 минут


Все оказалось гораздо проще..Взял скрипт Каталог фирм и организаций, немного его подогнал под требования заказчика.Потом курьеры заказчика по почте и ножками оповестили все более-менее значимые конторы Казахстана о том, что открыт НОВЫЙ ПОИСКОВИК :) по СТРАНЕ.. И пока информация в него добавляется БЕСПЛАТНО..На это магическое слово клюнуло около 90% фирм..Личные странички заказчику нафиг не нужны, а по остальным ВЕБ - сайтам разослали предложение зарегиться на поисковике за 1 бакс.. Ну т.е. заплатили за регистрацию админам помалеху..И УСЕ :)НОвый поисковик готов..Вот такие вот пироги..Лано страна небольшая - все у них получилось и все довольны.. :)

ИМХО бред, из каталога фирм, делать поисковик по сайтам... проще кажется из каталога сайтов намутить. А если поиск исключительно по фирмам, то вопрос по теме надо былобы поставить иначе, т.к. это совсем другое дело... нет заморочек с серверами (достаточно одного мощного сервера на весь Казахстан), т.к. регулярная индексация всех фирм проводится не будет и т.п.
 
ИМХО бред, из каталога фирм, делать поисковик по сайтам... проще кажется из каталога сайтов намутить. А если поиск исключительно по фирмам, то вопрос по теме надо былобы поставить иначе, т.к. это совсем другое дело... нет заморочек с серверами (достаточно одного мощного сервера на весь Казахстан), т.к. регулярная индексация всех фирм проводится не будет и т.п.

А никто и не говорил про ПОИСКОВИК ПО САЙТАМ...
 
А если не секрет, какой именно движёк использовали, сколько примерно фирм он индексирует и на каком сервере(серверах). Просто чтобы представить масштабы затрат на подобный проект без учёта самого программирования-модификации :)

Заранее благодарю.
 
Тема интересная
Есть реальные движки поисковиков? До Яши понятно не дотянуться, но сделать поиск именно региональный - по стране или городу - точто надо!
Посоветуйте скриптик :ah:
 
Все оказалось гораздо проще..Взял скрипт Каталог фирм и организаций, немного его подогнал под требования заказчика.Потом курьеры заказчика по почте и ножками оповестили все более-менее значимые конторы Казахстана о том, что открыт НОВЫЙ ПОИСКОВИК :) по СТРАНЕ.. И пока информация в него добавляется БЕСПЛАТНО..На это магическое слово клюнуло около 90% фирм..Личные странички заказчику нафиг не нужны, а по остальным ВЕБ - сайтам разослали предложение зарегиться на поисковике за 1 бакс.. Ну т.е. заплатили за регистрацию админам помалеху..И УСЕ :)НОвый поисковик готов..Вот такие вот пироги..Лано страна небольшая - все у них получилось и все довольны.. :)

Действительно бред. У тебя получился не поисковик а все тот же каталог, с поиском по содержимому. А ты нам сидишь и втираешь какой ты молодец, что сделал из каталога поисковик... тупо. Каталог и остался. ;)
 
Реализация поиска на Яндекс.XML

Вот пример кода как сделать поиск по интернету на основе поиска Яндекс:
index.php
PHP:
<?php
require_once 'Yandex.php';
// get "query" and "page" from request
$query = isset($_REQUEST['query'])?$_REQUEST['query']:'';
$page  = isset($_REQUEST['page']) ?$_REQUEST['page']:0;

if ($query) {
    // Create new instance of Yandex class
    $Yandex = new Yandex();
    
    // Set Query
    $Yandex -> query($query)
          //-> host($host)
            -> page($page)                      // set current page
            -> limit(10)                        // set page limit
            -> set('max-title-length',   160)   // set some options
            -> set('max-passage-length', 200)
            -> request()                        // send request
            ;
}

// current URL
$url = "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$url = substr($url, 0, strpos($url, '?')) .'?query='.urlencode($query);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2002/REC-xhtml1-20020801/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Yandex XML Search</title>
    <meta name="keywords" content="Yandex XML, PHP, PHP5" />
    <meta name="description" content="Yandex XML Search for PHP" />    
    <link rel="stylesheet" href="styles.css" type="text/css" />
</head>
<body>
<div class="body">
    <div class="form">
    
    <form>
        <b><big><font color="#ff0000">Я</font></big>ндекс</b> <input type="text" name="query" class="txt" value="<?php echo $query;?>"/> 
        <input type="submit" class="smb" name="search" value="Ищи!"/>    
    </form>
    </div>
    <div class="data">
        <?php 
            // if $Yandex exists and don't have errors in response
            if (isset($Yandex) && empty($Yandex->error)) : 
        ?>
            Найдено: <?php echo $Yandex->total();?> страниц
            <ol start="<?php echo $Yandex->getLimit()*$Yandex->getPage() + 1;?>">
            <?php foreach ($Yandex->result->response->results->grouping->group as $group) :?>
                <li><a href="<?php echo $group->doc->url; ?>" title="<?php echo $group->doc->url; ?>" ><?php Yandex::highlight($group->doc->title); ?></a>
                    <?php if (isset($group->doc->passages->passage)) : ?>
                    <ul>
                        <?php foreach ($group->doc->passages->passage as $passage) :?>
                        <li><?php Yandex::highlight($passage);?></li>                    
                        <?php endforeach;?>
                    </ul>
                    <?php endif; ?>
                </li>
            <?php endforeach;?>
            </ol>
            
            <?php foreach ($Yandex->pageBar() as $page => $value) : ;?>
                <?php // switch statement for $value['type']
                switch ($value['type']) {
                        case 'link':
                                echo '<a href="'. $url .'&page='. $page .'" title="Page '. ($page+1) .'">'. sprintf($value['text'], $page+1) .'</a> | ';
                                break;
                        case 'current':
                                echo sprintf($value['text'], $page+1) .' | ';
                                break;
                        case 'text':
                                echo $value['text'] .' | ';
                                break;
                
                        default:
                                break;
                }
                ?>
            <?php endforeach;?>
            <?php if ($Yandex->getPage() < $Yandex->pages()) : ?>
                .. |
                <a href="<?php echo $url;?>&page=<?php echo $Yandex->getPage()+1;?>" title="Next Page">&raquo;</a>
            <?php endif; ?>
        <?php 
            // Error in response
            elseif(isset($Yandex) && isset($Yandex->error)):
        ?>
            <div class="error"><?php echo $Yandex->error; ?></div>
        <?php endif; ?>
    </div>
</div>
</body>
</html>
yandex.php
PHP:
<?php
/**
 * Class Yandex
 *
 * yandex search class
 *
 * @author   Anton Shevchuk <AntonShevchuk@gmail.com>
 * @link     http://anton.shevchuk.name
 * @access   public
 * @package  Yandex.class.php
 * @created  Thu Aug 14 12:12:54 EEST 2008
 */
class Yandex
{
    /**
     * Response
     *
     * @var SimpleXML
     */
    public $result;

    /**
     * Query
     *
     * @var string
     */
    protected $query;

    /**
     * Number of page
     *
     * @var integer
     */
    protected $page = 0;

    /**
     * Number of results per page   
     *
     * @var integer
     */
    protected $limit = 10;

    /**
     * Options of search
     *
     * @var array
     */
    protected $options = array(
        'sortby'                => null , // http://help.yandex.ru/xml/?id=316625#sort <rlv> <tm>
        'maxpassages'           => null , // from 2 to 5
        'groupings'             => null , // http://help.yandex.ru/xml/?id=316625#group <d> <geo> <cat> <>
        'max-title-length'      => null , //
        'max-headline-length'   => null , // 
        'max-passage-length'    => null , //
        'max-text-length'       => null , // 

    );

    /**
     * Error code
     *
     * @var integer
     */
    public $error = null;
    
    /**
     * Errors in response
     *
     * @var array
     */
    // TODO: add all errors code
    protected $errors = array(
        1 => 'Синтаксическая ошибка — ошибка в языке запросов',
        2 => 'Задан пустой поисковый запрос — элемент query не содержит данных',
        8 => 'Зона не проиндексирована — обратите внимание на корректность параметров зонно-атрибутивного поиска',
        9 => 'Атрибут не проиндексирован — обратите внимание на корректность параметров зонно-атрибутивного поиска',
       10 => 'Атрибут и элемент не совместимы — обратите внимание на корректность параметров зонно-атрибутивного поиска',
       12 => 'Результат предыдущего запроса уже удален — задайте запрос повторно, не ссылаясь на идентификатор предыдущего запроса',
       15 => 'Найдётся всё. Со временем',
       18 => 'Ошибка в XML-запросе — проверьте валидность отправляемого XML и корректность параметров',
       19 => 'Заданы несовместимые параметры запроса — проверьте корректность группировочных атрибутов',
       20 => 'Неизвестная ошибка — при повторяемости ошибки обратитесь к разработчикам с описанием проблемы',
    );

        /**
         * Constructor of Yandex
         *
         * @access  public
         */
        function __construct()
        {

        }

        /**
         * Destructor of Yandex
         *
         * @access  public
         */
         function __destruct()
         {

         }

         /**
          * query
          *
          * @access  public
          * @param   string   $query
          * @return  Yandex
          */
         public function query($query)
         {
            $this->query = $query;
                return $this;
         }
         
         /**
          * getQuery
          *
          * @access  public
          * @return  string
          */
         public function getQuery()
         {
            return $this->query;
         }

         /**
          * page
          *
          * @access  public
          * @param   integer   $page
          * @return  Yandex
          */
         public function page($page)
         {
            $this->page = $page;
                return $this;
         }
         
         /**
          * getPage
          *
          * @access  public
          * @return  integer
          */
         public function getPage()
         {
            return $this->page;
         }

         /**
          * limit
          *
          * @access  public
          * @param   integer   $limit
          * @return  Yandex
          */
         public function limit($limit)
         {
            $this->limit = $limit;
                return $this;
         }
         
         /**
          * getLimit
          *
          * @access  public
          * @return  integer
          */
         public function getLimit()
         {
            return $this->limit;
         }

         /**
          * set
          *
          * @access  public
          * @param   string   $option
          * @param   mixed    $value
          * @return  Yandex
          */
         public function set($option, $value = null) 
         {
            $this->options[$option] = $value;
                return $this;
         }

         /**
          * request
          *
          * send request
          *
          * @access  public
          * @return  Yandex  
          */
         public function request() 
         {
             if (empty($this->query)) {
                 throw new Exception('Query is empty');
             }

                $request  = '<?xml version="1.0" encoding="utf-8"?>
                             <request>';
                // add query to request
                $request .= '<query><![CDATA['.$this->query.']]></query>';
                
                if ($this->page) {
                    $request .= '<page>'.$this->page.'</page>';
                }

                $request .= '<groupings>
                        <groupby  attr="" mode="flat" groups-on-page="'.$this->limit.'" docs-in-group="1" curcateg="-1" />
                    </groupings>';
                
                // TODO: add groupings and sortby realisation
                
                /*
                <sortby order="descending" priority="no">rlv</sortby>
                
                <groupings>
            <groupby attr="d" mode="deep" groups-on-page="10" docs-in-group="1" curcateg="-1"/>
        </groupings>
        
        <groupings>
            <groupby attr="" mode="flat" groups-on-page="10" docs-in-group="1" />
        </groupings>
                */
                
                if ($this->options['maxpassages']) {
                    $request .= '<maxpassages>'.$this->options['maxpassages'].'</maxpassages>';
                }
                
                if ($this->options['max-title-length']) {
                    $request .= '<max-title-length>'.$this->options['max-title-length'].'</max-title-length>';
                }

                if ($this->options['max-headline-length']) {
                    $request .= '<max-headline-length>'.$this->options['max-headline-length'].'</max-headline-length>';
                }
                
                if ($this->options['max-passage-length']) {
                    $request .= '<max-passage-length>'.$this->options['max-passage-length'].'</max-passage-length>';
                }

                if ($this->options['max-text-length']) {
                    $request .= '<max-text-length>'.$this->options['max-text-length'].'</max-text-length>';
                }
                
                
                $request .= '</request>';
                
            $ch = curl_init();    
        curl_setopt($ch, CURLOPT_URL, "http://xmlsearch.yandex.ru/xmlsearch");
        curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: application/xml"));
        curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Accept: application/xml"));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
        curl_setopt($ch, CURLOPT_POST, TRUE);    
        $data = curl_exec($ch);

        $this->result = new SimpleXMLElement($data);
        $this->checkErrors();

        return $this;
         }

         /**
          * checkErrors
          *
          * check response errors
          *
          * @author  dark
          * @class   
          * @access  public
          * @param   type     $param  param_descr
          * @return  rettype  return
          */
         protected function checkErrors()
         {
                // switch statement for $this->result->response->error
                switch (true) {
                        case isset($this->result->response->error) && 
                            ($error = $this->result->response->error->attributes()->code || $this->result->response->error->attributes()->code === 0):
                             $error = (int)$error;
                            if (isset($this->errors[$error])) {
                                $this->error = $this->errors[$error];
                            } else {
                            $this->error = $this->result->response->error;
                        }
                                break;
                                
                        case isset($this->result->response->error) && !empty($this->result->response->error):
                                $this->error = $this->result->response->error;
                                break;

                        default:
                            $this->error = null;
                                break;
                }
         }

         /**
          * total
          *
          * get total results
          * 
          * @access  public
          * @return  integer
          */
         public function total()
         {
             // FIXME: need fix?
             if (empty($this->total)) {
                 $res = $this->result->xpath('response/found[attribute::priority="all"]');
                 $this->total = (int)$res[0];
             }
                 return $this->total;
         }

         /**
          * pages
          *
          * get total pages
          *
          * @access  public
          * @param   type     $param  param_descr
          * @return  rettype  return
          */
         public function pages() 
         {
             if (empty($this->pages))
                     $this->pages = ceil($this->total() / $this->limit);
             return $this->pages;
         }
         
         /**
          * pageBar
          *
          * return pagebar
          *
          * @access  public
          * @return  rettype  return
          */
         public function pageBar() 
         {
             // FIXME: not good
                $pages = $this->pages();
                
                if ($pages < 10) {
                    $pagebar = array_fill(0, $pages, array('type'=>'link', 'text'=>'%d'));
                } elseif ($pages >= 10 && $this->page < 9) {
                    $pagebar = array_fill(0, 10, array('type'=>'link', 'text'=>'%d'));
                    $pagebar[$this->page] = array('type'=>'current', 'text'=>'<b>%d</b>');
                } elseif ($pages >= 10 && $this->page >= 9) {
                    $pagebar = array_fill(0, 2, array('type'=>'link', 'text'=>'%d'));
                    $pagebar[] = array('type'=>'text', 'text'=>'..');
                    $pagebar += array_fill($this->page-2, 2, array('type'=>'link', 'text'=>'%d'));      
                    if ($pages > ($this->page+2))
                        $pagebar += array_fill($this->page, 2, array('type'=>'link', 'text'=>'%d'));                
                    $pagebar[$this->page] = array('type'=>'current', 'text'=>'<b>%d</b>');
                }
                return $pagebar;
         }

         
         /**
          * highlight
          *
          * highlight text
          *
          * @access  public
          * @param   SimpleXML $text  
          * @return  rettype   return
          */     
         static function highlight($text) 
         {
             // FIXME: very strangely method
             $xml = $text->asXML();

             $xml = str_replace('<hlword priority="strict">', '<b>', $xml);
             $xml = str_replace('</hlword>', '</b>', $xml);
             $xml = strip_tags($xml, '<b>');
             
             echo $xml;
         }
}

styles.css
Код:
body {
	margin: 30px auto;
	padding: 0;
	width: 650px;
	font: 75%/160% Verdana, Helvetica, sans-serif;
	color: #333333;
}
a {
	color: #FF3300;
}

a:focus {
	outline: none;
}

.form {
    text-align:center;
}

.form input.txt {
    border:0;
    border-bottom: 1px solid #999;
    background: #FAFAFA;
}

.form input.smb {
    border:0;
    /*font-weight:bold;*/
    background: #fff;
    cursor:pointer;
}


.data ol li{
    margin-top: 8px;
}
.data ol li a{
    font-size:1.2em;
}

.data ul{
    padding:0;
    margin:0;
}

.data ul li{
    list-style:none;
    border-left: 4px solid #FAD2D2;
    border-bottom: 1px solid #FAD2D2;
    padding-left: 4px;
    margin-left: 4px;
    margin-top: 2px;
}

.error {
	color: #FF3300;
}

.loading {  
	border: 1px #999 dotted;
    background: #FAFAD2 url(ajax-loader.gif) left top no-repeat;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху