/** * Поиск по индексу * @param nc_search_query $query * @param boolean $should_highlight * @return nc_search_result */ public function find(nc_search_query $query, $should_highlight = true) { nc_search::set_current_context(new nc_search_context(array('search_provider' => get_class($this), 'action' => 'searching', 'language' => $query->get('language')))); $index = $this->get_index(); $lucene_query = $this->get_lucene_query($query); if ($query->get('sort_by')) { // custom sort $lucene_result = $index->find($lucene_query, $query->get('sort_by'), SORT_STRING, $query->get('sort_direction')); } else { $lucene_result = $index->find($lucene_query); } $total_hits = count($lucene_result); $result = new nc_search_result(array(), $total_hits); $result->set_query($query); if (!$should_highlight) { $result->disable_highlighting(); } nc_search::set_current_context(); // truncate to get the requested page only $lucene_result = array_slice($lucene_result, $query->get('offset'), $query->get('limit')); // сформировать nc_search_result $result_ids = array(); foreach ($lucene_result as $hit) { $result_ids[] = $hit->doc_id; } if (count($result_ids)) { foreach ($result_ids as $i => $id) { $result_ids[$i] = (int) trim($id, "x"); } $id_list = join(", ", $result_ids); $doc = new nc_search_result_document(); $fields = $doc->get_column_names($query->get('options_to_fetch')); $query = "SELECT {$fields} FROM `%t%` WHERE `Document_ID` IN ({$id_list}) " . "ORDER BY FIELD(`Document_ID`, {$id_list})"; $result->select_from_database($query); } return $result; }