/** * @return nc_search_persistent_data_collection */ protected static function get_all_extensions() { if (!self::$all_extensions) { self::$all_extensions = nc_search::load('nc_search_extension_rule', 'SELECT * FROM `%t%` WHERE `Checked` = 1 ORDER BY `Priority`'); } return self::$all_extensions; }
/** * Выполнить первую задачу из очереди * @param int $indexer_strategy * @return bool|null */ public static function run($indexer_strategy = nc_search::INDEXING_NC_CRON) { $provider = nc_search::get_provider(); if ($provider->is_reindexing()) { nc_search::log(nc_search::LOG_SCHEDULER_START, "Scheduler: indexing in progress"); return false; } $intent = nc_search::load('nc_search_scheduler_intent', 'SELECT * FROM `%t%`' . ' WHERE `StartTime` <= ' . time() . ' ORDER BY `StartTime` ASC LIMIT 1')->first(); if (!$intent) { nc_search::log(nc_search::LOG_SCHEDULER_START, "Scheduler: no scheduler intents to process now"); return false; } if (nc_search::will_log(nc_search::LOG_SCHEDULER_START)) { nc_search::log(nc_search::LOG_SCHEDULER_START, "Scheduler started (planned start time: " . strftime("%Y-%m-%d %H:%M:%S", $intent->get('start_time')) . "; area: '" . preg_replace("/\\s+/u", " ", $intent->get('area_string')) . "')"); } // информация принята к сведению и больше не нужна $intent->delete(); // запуск индексации $provider->index_area($intent->get('area_string'), $indexer_strategy); }
/** * @param array $terms * @return array */ public function filter(array $terms) { if (!nc_search::should('RemoveStopwords')) { return $terms; } $language = $this->context->get('language'); if (!isset(self::$lists[$language])) { $query = "SELECT * FROM `%t%` WHERE `Language`='" . nc_search_util::db_escape($language) . "'"; self::$lists[$language] = nc_search::load('nc_search_language_stopword', $query, 'word'); } $stop_list = self::$lists[$language]; if (!count($stop_list)) { return $terms; } $result = array(); foreach ($terms as $term) { if (is_array($term)) { // alternative forms foreach ($term as $i => $t) { if ($stop_list->has_key($t)) { unset($term[$i]); } } $terms_left = count($term); if ($terms_left == 1) { $result[] = $term[0]; } elseif ($terms_left > 1) { $result[] = $term; } } elseif (!$stop_list->has_key($term)) { // ordinary term $result[] = $term; } } return $result; }
<?php if (!class_exists("nc_system")) { die; } $ui = $this->get_ui(); $ui->add_lists_toolbar(); $stopwords = nc_search::load('nc_search_language_stopword', "SELECT * FROM `%t%` ORDER BY `Language`, `Word`")->set_output_encoding(nc_core('NC_CHARSET')); if (count($stopwords)) { // фильтр $language_options = array("<option value=''>" . NETCAT_MODULE_SEARCH_ADMIN_LANGUAGE_ANY_LANGUAGE . "</option>"); foreach ($this->get_language_list() as $code => $lang) { if ($stopwords->first('language', $code)) { $language_options[] = "<option value='{$code}'>{$lang}</option>"; } } echo "<div class='live_filter' id='stopword_filter'>", "<span class='icon'>", nc_admin_img("i_field_search_off.gif", NETCAT_MODULE_SEARCH_ADMIN_FILTER), "</span>", "<select id='filter_language'>", join("\n", $language_options), "</select>", "<input type='text' id='filter_word'>", "<span class='reset'>", "<div class='icons icon_delete' title='" . NETCAT_MODULE_SEARCH_ADMIN_FILTER_RESET . "' style='margin-top:5px'></div>", "</span>", "</div>"; ?> <form method="POST" action="?view=stopwords" onsubmit="return ($nc('input:checked').size() > 0)"> <input type="hidden" name="action" value="delete" /> <input type="hidden" name="data_class" value="nc_search_language_stopword" /> <table id="stopword_table" class="nc-table nc--striped nc--hovered nc--small" width="100%"> <tr align="left"> <th><?php echo NETCAT_MODULE_SEARCH_ADMIN_LANGUAGE; ?> </th> <th width="75%"><?php echo NETCAT_MODULE_SEARCH_ADMIN_STOPWORD; ?>
die; } $ui = $this->get_ui(); $ui->add_lists_toolbar(); $nc_core = nc_Core::get_object(); // предупредить, если мы сохранили не то, что ввёл пользователь $crud_record = $this->get_action_record(); if ($crud_record && !$crud_record->get('dont_filter')) { $input = $this->get_input('data'); $saved_value = !$nc_core->NC_UNICODE ? $nc_core->utf8->array_utf2win($crud_record->get('words')) : $crud_record->get('words'); if ($input['words'] != $saved_value) { nc_print_status(NETCAT_MODULE_SEARCH_ADMIN_SYNONYM_SAVE_RESULT, 'info', array(join(' ', $saved_value), $this->hash_href("#module.search.synonyms_edit({$crud_record->get_id()})"))); } } // end of "show a notice" $synonyms = nc_search::load('nc_search_language_synonyms', "SELECT * FROM `%t%` ORDER BY `Language`")->set_output_encoding(nc_core('NC_CHARSET')); if (count($synonyms)) { // фильтр $language_options = array("<option value=''>" . NETCAT_MODULE_SEARCH_ADMIN_LANGUAGE_ANY_LANGUAGE . "</option>"); foreach ($this->get_language_list() as $code => $lang) { if ($synonyms->first('language', $code)) { $language_options[] = "<option value='{$code}'>{$lang}</option>"; } } echo "<div class='live_filter' id='synonym_filter'>", "<span class='icon'>", nc_admin_img("i_field_search_off.gif", NETCAT_MODULE_SEARCH_ADMIN_FILTER), "</span>", "<select id='filter_language'>", join("\n", $language_options), "</select>", "<input type='text' id='filter_words'>", "<span class='reset'>", "<div class='icons icon_delete' title='" . NETCAT_MODULE_SEARCH_ADMIN_FILTER_RESET . "' style='margin-top:5px'></div>", "</span>", "</div>"; ?> <form method="POST" action="?view=synonyms" onsubmit="return ($nc('input:checked').size() > 0)"> <input type="hidden" name="action" value="delete" /> <input type="hidden" name="data_class" value="nc_search_language_synonyms" /> <table id="synonym_table" class="nc-table nc--striped nc--hovered nc--small" width="100%">
protected function load_synonyms($language) { $query = "SELECT * FROM `%t%` WHERE `Language`='" . nc_search_util::db_escape($language) . "'"; self::$lists[$language] = nc_search::load('nc_search_language_synonyms', $query); }
<?php if (!class_exists("nc_system")) { die; } $ui = $this->get_ui(); if (!nc_search::should('EnableSearch')) { nc_print_status(NETCAT_MODULE_SEARCH_ADMIN_SETTING_SEARCH_DISABLED, "error", array($this->hash_href("#module.search.generalsettings"), "_top")); } $rules = nc_search::load('nc_search_rule', "SELECT * FROM `%t%` ORDER BY `Rule_ID`")->set_output_encoding(nc_core('NC_CHARSET')); if (count($rules)) { foreach ($rules as $r) { // строчка «последняя индексация» $last_start_time = $r->get('last_start_time'); $last_finish_time = $r->get('last_finish_time'); if (!$last_start_time) { $last_run = NETCAT_MODULE_SEARCH_ADMIN_RULE_NEVER_RUN . "."; } else { $last_run = NETCAT_MODULE_SEARCH_ADMIN_RULE_LAST_RUN . ": " . nc_search_util::format_time($last_start_time) . " ("; if ($last_finish_time < $last_start_time) { $last_run .= NETCAT_MODULE_SEARCH_ADMIN_RULE_LAST_RUN_NOT_FINISHED; } else { $last_run .= NETCAT_MODULE_SEARCH_ADMIN_RULE_LAST_RUN_DURATION . " " . nc_search_util::format_seconds($last_finish_time - $last_start_time); } $last_run .= ")."; } // конец формирования строчки «последняя индексация» // строчка с результатми последней индексации $stats = ""; if ($last_start_time) { $result = $r->get('last_result');
if (!class_exists("nc_system")) { die; } // if (!nc_search::should('EnableSearch')) { // nc_print_status(NETCAT_MODULE_SEARCH_ADMIN_SETTING_SEARCH_DISABLED, "error", // array($this->hash_href("#module.search.generalsettings"), "_top")); // return; // } $nc_core = nc_core(); $db = $this->get_db(); $provider = nc_search::get_provider(); $is_history_saved = nc_search::should('SaveQueryHistory'); // ----------------------------------------------------------------------------- // Невыполненные задачи $rules = nc_search::load('nc_search_rule', "SELECT * FROM `%t%` ORDER BY `LastStartTime` DESC"); if (count($rules)) { $pending_time = time() - 12 * 60 * 60; $pending_tasks = $db->get_var("SELECT `StartTime`\n FROM `Search_Schedule`\n WHERE `StartTime` < {$pending_time}\n LIMIT 1"); if ($pending_tasks) { $error_message = NETCAT_MODULE_SEARCH_WIDGET_CHECK_CRONTAB; } } else { $error_message = NETCAT_MODULE_SEARCH_WIDGET_NO_RULES; } // Ошибки конфигурации ob_start(); // (1) Индексатор $provider->check_environment(true); // (2) Парсеры $parser_context = new nc_search_context(array('search_provider' => $provider));
<?php if (!class_exists("nc_system")) { die; } $ui = $this->get_ui(); $ui->add_settings_toolbar(); $ui->add_submit_button(NETCAT_MODULE_SEARCH_ADMIN_SETTINGS_SAVE); $fields = nc_search::load('nc_search_field', 'SELECT * FROM `%t%` ORDER BY `Weight` DESC', 'name')->set_output_encoding(nc_core('NC_CHARSET')); // СОХРАНЕНИЕ ПАРАМЕТРОВ // входящие данные: content[], title, weight[], custom[] // В отображении для простоты восприятия имеется несколько блоков: // «область индексирования», «вес тэгов», «извлечение данных». Сущность, стоящая // за этими «подтипами» областей HTML-документов на самом деле одна — nc_search_field. // За эту простоту пришлось заплатить запутанной процедурой сохранения данных: $input_content = $this->get_input('content'); if ($input_content) { $fields["content"]->set('query', $input_content['query'])->set('filter_content', $input_content['filter_content'])->save(); } // title $input_title = $this->get_input('title'); if ($input_title) { $fields["title"]->set('weight', $input_title['weight'])->save(); } $saved_weight_fields = array(); // поля, которые были сохранены (для последующего удаления отсутствующих полей) // произвольный набор полей с весами в weight[] $input_weight = $this->get_input('weight'); // «тэги с весом», указанные пользователем if (is_array($input_weight)) { // (1) объединить поля с одинаковым весом
<?php if (!class_exists("nc_system")) { die; } $ui = $this->get_ui(); $ui->add_settings_toolbar(); $extensions = nc_search::load('nc_search_extension_rule', "SELECT *\n FROM `%t%`\n WHERE `ExtensionInterface` != 'nc_search_provider'\n ORDER BY `ExtensionInterface`, `Priority`, `Language`")->set_output_encoding(nc_core('NC_CHARSET')); if (count($extensions)) { $show_provider_column = sizeof(array_unique($extensions->each('get', 'search_provider'))) > 1; $show_action_column = sizeof(array_unique($extensions->each('get', 'action'))) > 1; ?> <form method="POST" action="?view=extensions_confirm_delete" onsubmit="return ($nc('input:checked').size() > 0)"> <table class="nc-table nc--large nc--hovered nc--striped list"> <tr align="left"> <th><?php echo NETCAT_MODULE_SEARCH_ADMIN_EXTENSION_INTERFACE; ?> </th> <th><?php echo NETCAT_MODULE_SEARCH_ADMIN_EXTENSION_CLASS; ?> </th> <?php echo $show_provider_column ? "<th>" . NETCAT_MODULE_SEARCH_ADMIN_SEARCH_PROVIDER . "</th>" : ""; ?> <?php echo $show_action_column ? "<th>" . NETCAT_MODULE_SEARCH_ADMIN_EXTENSION_ACTION . "</th>" : ""; ?> <th><?php
$num_queries = 5; // сколько последних/популярных запросов выводить в статистике $queries_period = "`Timestamp` > (NOW() - INTERVAL 3 MONTH)"; // учитывать только эти запросы в списке популярных // ----------------------------------------------------------------------------- // ОБЩИЕ ПРЕДУПРЕЖДЕНИЯ // Индексатор nc_search::get_provider()->check_environment(); // Парсеры $parser_context = new nc_search_context(array('search_provider' => nc_search::get_setting('SearchProvider'))); $all_parsers = nc_search_extension_manager::get('nc_search_document_parser', $parser_context)->get_all(); foreach ($all_parsers as $parser) { $parser->check_environment(); } // Невыполненные задачи $rules = nc_search::load('nc_search_rule', "SELECT * FROM `%t%` ORDER BY `LastStartTime` DESC")->set_output_encoding(nc_core('NC_CHARSET')); if (!count($rules)) { nc_print_status(NETCAT_MODULE_SEARCH_ADMIN_NO_RULES, 'info', array($this->hash_href("#module.search.rules_edit"))); } else { $pending_time = time() - 12 * 60 * 60; $pending_tasks = $db->get_var("SELECT `StartTime` FROM `Search_Schedule` WHERE `StartTime` < {$pending_time} LIMIT 1"); if ($pending_tasks) { nc_print_status(NETCAT_MODULE_SEARCH_ADMIN_STAT_CHECK_CRONTAB, 'error'); } } // ----------------------------------------------------------------------------- echo "<div class='stat'>"; // ----------------------------------------------------------------------------- echo "<fieldset><legend>", NETCAT_MODULE_SEARCH_ADMIN_STAT_HEADER, "</legend>", "<div class='param'><span class='name'>", NETCAT_MODULE_SEARCH_ADMIN_STAT_NUM_DOCUMENTS, "</span>: ", "<span class='value'>", $provider->count_documents(), "</span></div>\n", "<div class='param'><span class='name'>", NETCAT_MODULE_SEARCH_ADMIN_STAT_NUM_SITEMAP_URLS, "</span>: ", "<span class='value'>", $db->get_var("SELECT COUNT(*) FROM `Search_Document` WHERE `IncludeInSitemap` = 1"), "</span></div>\n"; if ($is_history_saved) { echo "<div class='param'><span class='name'>", NETCAT_MODULE_SEARCH_ADMIN_STAT_NUM_QUERIES_TODAY, "</span>: ", "<span class='value'>", $db->get_var("SELECT COUNT(*)\n FROM `Search_Query`\n WHERE `Timestamp` >= DATE(NOW())"), "</span></div>\n", "<div class='param'><span class='name'>", NETCAT_MODULE_SEARCH_ADMIN_STAT_NUM_QUERIES_YESTERDAY, "</span>: ", "<span class='value'>", $db->get_var("SELECT COUNT(*)\n FROM `Search_Query`\n WHERE `Timestamp` BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND DATE(NOW())"), "</span></div>\n";