1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Поиск Yandex.XML в PHP

Тема в разделе "Web Coding", создана пользователем D@nil, 22 июл 2007.

Статус темы:
Закрыта.
Модераторы: latteo
  1. D@nil

    D@nil

    Регистр.:
    1 окт 2006
    Сообщения:
    338
    Симпатии:
    122
    Почти всегда при разработке сайта возникает задача поиска по его содержимому. Будь-то поиск по каким-то данным из БД, или же поиск по статическим файлам на сервере — обычно задача сводится к полнотекстовому поиску по всей информации на сайте.

    Решений здесь можно придумать великое множество, среди того что приходит в голову можно выделить:

    • Свое решение путем создания простого текстового индекса для каждого из текстовых файлов сайта (обычно — html), и самый простой булевый поиск на совпадение/не совпадение слов запроса словам из индекса. Тут же можно реализовать элементарный язык запросов, который, например будет понимать OR и AND
    • В случае хранения информации в СУБД MySQL >=3.23.23, можно попробовать организовать поиск используя встроенный FULLTEXT Search движок MySQL, определив колонки для поиска как индексы типа FULLTEXT. Такой поиск представляется весьма заманчивым, т.к. поддерживает сразу же несколько режимов (BOOLEAN, NATURAL LANGUAGE, QUERY EXPANSION) и довольно просто реализуется на уровне элементарных запросов к СУБД. Также, начиная с версии 5.1 в MySQL можно писать свои поисковые движки, и один из них следует упомянуть — SphinxSearch. В то же время, основным недостатком является время добавления нового документа в базу, и время поиска. На shared хостингах это время может быть сравнимо с десятками секунд, а то и минут — что выглядит ужасно.
    • Сторонние решения, в виде внешних библиотек и подключаемых модулей к php. Из известных мне систем — mnogoSearch, Apache Lucene. Но для установки первого требуются дополнительные бинарные модули к PHP, которые за просто так на shared хостинге вам никто не поставит, ну а второй — до мозга костей написан на Java. Осюда вывод, что подобные системы подходят для солидных проектов, где можно себе позволить заплатить за colocation или за виртуальный сервер и ставить там все что душе угодно.

    Все вышеперечисленные решения никуда не годятся, если надо быстро поставить качественный поиск на средних размеров сайт на shared хостинге. Лично я, пришел к решению на базе Yandex.XML — быстро устанавливается, хорошо интегрируется в дизайн сайта, и главное — хорошо ищет (оно и не удивительно, ведь это поиск от Яндекса ;)

    Описание и лицензия.
    Если вкратце, то Яндекс.XML это XML сервис который принимает на вход POST/GET запросы и на выходе отдает сформированный XML документ с результатами поиска, с которым потом можно делать что угодно (обычно далее идет преобразование XSLT и на выходе нужный нам HTML).

    Для активации сервиса для вашего сайта нужно всего лишь зарегистрировать IP адрес сайта в базе Яндекса. После этого станет доступен бесплатный вариант поиска, который предполагает не более 500 запросов в сутки с одного IP.

    Бесплатный вариант лицензии Яндекс.XML также предполагает размещение фразы «Поиск реализован на основе Яндекс.XML» вверху результатов поиска на вашем сайте.

    В целом, это все что требуется знать перед началом.

    Установка
    Разработчику, прежде всего, следует начать с Документации по Яндекс.XML, там же есть интересные примеры использования, примеры поисковых запросов, XSLT файлы с парочкой дизайнов, и даже программный код, но увы, на Perl.

    Перед началом, нам надо скачать один из XSLT-дизайнов (маньякам — предлагается потратить день-другой на написание своего;)

    Итак, код для PHP4, с XSLT парсером Sablotron:
    PHP:
    <?php
    // для удобства
    function request($name$default_value FALSE)  {
     return  (isset(
    $_REQUEST[$name]) && !empty($_REQUEST[$name]))?$_REQUEST[$name]:$default_value;
    }

    $query   request("query"); // Поисковый запрос
    $page    request("page"0); // Номер страницы



    $OUTPUT ""// Переменная будет содержать результат поиска.

    if (FALSE !== $query)
    {
                 
    // Включаем стандартный компонент из PEAR для последующего формирования
                 // GET запроса к Яндекс.
        
    require_once 'HTTP/Request.php';

        
    $req  = new HTTP_Request("http://xmlsearch.yandex.ru/xmlsearch");
        
    $req->setMethod(HTTP_REQUEST_METHOD_GET);
        
         
          
    // Следующий код нужен для нормальной поддержки пейджинга поисковых результатов, 
          // а также для преобразования UTF-8 строки запроса в кодировку Windows-1251. 
          // $DOMAIN_NAME это имя хоста, например myhost.com.ua
        
    if (strstr($query"host=") === FALSE )
          
    $full_query $query.' << host="'.$DOMAIN_NAME.'"'
        else 
          
    $full_query stripslashes(iconv("UTF-8""CP1251"$query));

        
        
    $req->addQueryString('query'htmlspecialchars($full_query));
        
    $req->addQueryString('page'$page);
        
    $req->addQueryString("maxpassages"2);
        

        
    $req->sendRequest(); // Посылаем GET запрос к Яндексу
        
    $xml_data $req->getResponseBody();  // Получаем XML ответ от Яндекса
        
        // Получаем содержимое нашего XSL-дизайна
        
    $xsl_data  file_get_contents("search.xsl"); 

        
    $arguments = array('/_xml' => $xml_data,'/_xsl' => $xsl_data );

        
    // Создание XSLT процессора
        
    $xh xslt_create();
        
        
    // Обратываем XML запрос
        
    $result xslt_process($xh'arg:/_xml''arg:/_xsl'NULL$arguments); 
        
        if (
    $result) {
            
    $OUTPUT =  $result// передаем результирующий HTML на выход 
        
    } else {
            
    //Обрабатываем ошибки
           
    $OUTPUT.= "Sorry, ".$el[file]." could not be transformed by $xsl_file,";
           
    $OUTPUT.="the reason is that " xslt_error($xh) . " and the error code is " xslt_errno($xh);
                
        }
        
    xslt_free($xh);



    echo(
    $OUTPUT); // Выводим результаты поиска.
    ?>
    Для работоспособности кода нужно установить себе пакет PEAR/HTTP (http://pear.php.net), а также поместить в файл search.xsl — XSLT дизайн. В данном примере использовался вот этот

    Заключение
    Код местами кривоват, и его можно улучшить — но нужный функционал у нас есть. Единственное, с чем надо поиграться — это серией параметров которые передаются Яндексу — page, maxpassages, groupby, sortby

    Единственный минус при использовании данного сервиса — это то что ваш сайт УЖЕ должен быть проиндексирован Яндексом :)

    (c) developer.co.ua

    http://developer.co.ua/posts/view/poisk_yandex_xml_v_php
     
Статус темы:
Закрыта.