Exemplo n.º 1
0
 /**
  * Обработать ответ пользователя (crawler)
  * @param nc_search_indexer_crawler_response $response
  * @param nc_search_indexer_link $link
  * @return bool
  */
 protected function process_response(nc_search_indexer_crawler_response $response, nc_search_indexer_link $link)
 {
     $content_type = $response->get_content_type();
     $parser = $this->get_parser($content_type);
     $parser->load($response);
     // пусть парсер скажет, будем ли мы обрабатывать этот документ?
     // (например, не будем, если есть meta robots=noindex)
     if (!$parser->should_index()) {
         return false;
     }
     // получить ссылки
     $page_hrefs = $this->filter_links($parser->extract_links());
     $page_url = $response->get_url();
     // добавить ссылки в очередь (где-то там разберутся, чтобы ссылки
     // не повторялись и были абсолютными):
     $page_link_ids = $this->task->add_links($page_hrefs, $page_url);
     // распарсить контент
     $document = $parser->get_document();
     $document->set_values(array('url' => $page_url, 'path' => nc_search_util::get_url_path($page_url), 'content_type' => $content_type, 'to_delete' => false, 'last_modified' => $response->get_last_modified()));
     $this->apply_hierarchy_options($document);
     if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_BRIEF)) {
         nc_search::log(nc_search::LOG_PARSER_DOCUMENT_BRIEF, "Parsed document from '{$page_url}'. Indexed content: " . strlen($document->get('intact_content')) . " bytes");
     }
     if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_VERBOSE)) {
         nc_search::log(nc_search::LOG_PARSER_DOCUMENT_VERBOSE, $document->dump());
     }
     // добавить в индекс
     $this->index->process_document($document);
     // сохранить информацию о том, кто куда ссылается
     // (referrer_link_id сохраняется из-за неясностей/неточностей в ТЗ, которое
     // подразумевает, что сбор ссылок может производиться на страницах,
     // которые не сохраняются в индексе)
     $referrer_link_id = (int) $link->get_id();
     // might be null
     $doc_id = (int) $document->get_id();
     foreach ($page_link_ids as $page_link_id) {
         if (!$page_link_id) {
             continue;
         }
         $this->referrer_cache[] = "(" . $doc_id . "," . $referrer_link_id . "," . (int) $page_link_id . ")";
     }
     return true;
 }
Exemplo n.º 2
0
 /**
  * Возвращает ID ссылки с указанным URL; создает объект nc_search_indexer_link
  * при необходимости
  * @param string $url
  * @param string  $referrer
  * @return integer Link ID
  */
 public function add_link($url, $referrer = null)
 {
     $full_url = $this->resolve_link($url, $referrer);
     // считать URL’ы с "www." и без него синонимами (просто выкинуть "www.",
     // к сожалению, нельзя — не у всех правильно настроен сервер)
     $has_www = strpos($full_url, "://www.");
     $full_url_with_www = $has_www ? $full_url : str_replace("://", "://www.", $full_url);
     $full_url_without_www = $has_www ? str_replace("://www.", "://", $full_url) : $full_url;
     $link = new nc_search_indexer_link();
     // search for link with that URL in the database, create new if it's not there
     if (!$link->load_by_url(array($full_url_with_www, $full_url_without_www))) {
         // it's a brand new link
         $link->set("url", $full_url);
         $link->save();
         if (nc_search::will_log(nc_search::LOG_PARSER_DOCUMENT_LINKS)) {
             nc_search::log(nc_search::LOG_PARSER_DOCUMENT_LINKS, "Added link to the queue: " . nc_search_util::decode_url($full_url));
         }
     }
     return $link->get_id();
 }