Ejemplo n.º 1
0
 /**
  * @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;
 }
Ejemplo n.º 2
0
 /**
  * Выполнить первую задачу из очереди
  * @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);
 }
Ejemplo n.º 3
0
 /**
  * @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;
 }
Ejemplo n.º 4
0
<?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;
    ?>
Ejemplo n.º 5
0
    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%">
Ejemplo n.º 6
0
 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);
 }
Ejemplo n.º 7
0
<?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');
Ejemplo n.º 8
0
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));
Ejemplo n.º 9
0
<?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) объединить поля с одинаковым весом
Ejemplo n.º 10
0
<?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 
Ejemplo n.º 11
0
$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";