/** * Обработать документ (конкретный класс должен проверить, есть ли документ * в индексе, и в зависимости от этого обновить существующий документ или добавить * новый) * @param nc_search_document $document * @return bool */ public function process_document(nc_search_document $document) { $doc_hash = $document->generate_hash(); // Есть ли документ с таким путём в нашей базе? $stored = nc_search_document::get_hash_by_path($document->get('site_id'), $document->get('path')); if ($stored) { $document->set_id($stored->get_id()); // Нужно ли обновлять данные в индексе? Проверить хэш для content if ($stored->get('hash') == $doc_hash) { $document->save(); return false; // ---- RETURN ---- } } // Загрузить словарь в память? if (nc_search::should('DatabaseIndex_LoadAllCodesForIndexing')) { $this->load_dictionary(); } // (1) Сохранение документа в `Search_Document` $document->save(); $doc_id = $document->get_id(); $doc_context = $this->create_document_context($document); $all_terms = array(); // (2) Удаление старых данных из `Search_Index_FieldN` if ($stored) { $this->remove_document_fields($doc_id); } // (3) Обработка полей: сохранение данных в `Search_Index_FieldN` /** @var $field nc_search_field */ foreach ($document->get_fields() as $field) { if (!isset($this->skipped_fields[$field->get('name')])) { $all_terms[] = $this->store_field($doc_id, $field, $doc_context); } } // (4) Сохранение искабельного текста в `Search_Index` $this->store_index_data($this->index_table_name, $doc_id, join('/', array_filter($all_terms))); return true; }
/** * Добавление в индекс * @param nc_search_document $document */ protected function add_document(nc_search_document $document) { $document->save(); $this->set_indexing_context($document); $this->get_index()->addDocument($this->convert_document($document)); $this->remove_indexing_context(); }