Обновление компонента поиск
|
|
Автор: Fuze
Опубликовано: 247 дней назад (19 сентября 2011)
Блог: Ударный блог
Рубрика: Без рубрики
Редактировалось: 13 раз — последний 20 сентября 2011
|
+68↑ Голосов: 68 |
Итак, добрались наконец у меня руки до поиска по сайту.
Представляю вашему вниманию полностью переделанный компонент "Поиск".
- поиск выполняется только один раз при первом запросе(изменении запроса), при пагинации результаты берутся из кеша;
- общее снижение нагрузки на БД при поиске;
- заложена возможность использовать своего провайдера для поиска;
- при поиске заложена возможность выбора(чекбоксы) где искать;
- весь html вынесен в шаблоны;
- при поиске по тегу заложена возможность ручного ввода тега с автодополнением;
- добавлена задача cron на очищение таблицы cms_search раз в сутки;
- в результатах поиска теперь помимо заголовка, показывается описание;
- опции расширенного поиска;
- подсветка поисковых слов в выдаче;
- закрыта небольшая уязвимость.
Сразу хочу отметить, что глобально в алгоритме поиска ничего не менялось, было "выжато" максимум из полнотекстового поиска mysql.
Скачать можно отсюда, конкретные изменения можно посмотреть как обычно в траке.
Демо можно посмотреть этом сайте.
Пример:
Создаем файл yandex.php, в нем пишем
- метод __construct - конструктор класса, запускающий конструктор родителя;
- метод getProviderConfig - должен возвращать настройки провайдера, если таковые имеются. Формат массива настроек должен быть: ключ массива->название опции, значение->имя переменной. Если настроек нет, метод должен возвращать false. Настройки провайдера будут доступны внутри класса через $this->config['ИМЯ_ПРОВАЙДЕРА']['имя_переменной'], т.е. глядя на пример это будет $this->config['yandex']['api_url'].
- метод prepareSearch - должен выполнять непосредственно сам поиск и заносить все результаты поиска по данному запросу в таблицу cms_search. Заносить результаты поиска необходимо при помощи метода модели addResult($result_array). В массиве $result_array должны быть значения
Представляю вашему вниманию полностью переделанный компонент "Поиск".

Что сделано:
- полностью переписан код компонента, доработан алгоритм поиска;- поиск выполняется только один раз при первом запросе(изменении запроса), при пагинации результаты берутся из кеша;
- общее снижение нагрузки на БД при поиске;
- заложена возможность использовать своего провайдера для поиска;
- при поиске заложена возможность выбора(чекбоксы) где искать;
- весь html вынесен в шаблоны;
- при поиске по тегу заложена возможность ручного ввода тега с автодополнением;
- добавлена задача cron на очищение таблицы cms_search раз в сутки;
- в результатах поиска теперь помимо заголовка, показывается описание;
- опции расширенного поиска;
- подсветка поисковых слов в выдаче;
- закрыта небольшая уязвимость.
Сразу хочу отметить, что глобально в алгоритме поиска ничего не менялось, было "выжато" максимум из полнотекстового поиска mysql.
Скачать можно отсюда, конкретные изменения можно посмотреть как обычно в траке.
Как установить:
Архив распаковать с заменой на сервере, зайти в админку, в установку дополнений (/admin/index.php?view=install&do=component), нажать обновить компонент Поиск.Демо можно посмотреть этом сайте.
Как сделать своего провайдера поиска:
Для начала нужно создать в директории /components/search/providers файл с названием ИМЯ_ПРОВАЙДЕРА.php. В этом файле нужно написать одноименный класс - ИМЯ_ПРОВАЙДЕРА.Пример:
Создаем файл yandex.php, в нем пишем
Код PHP:
Все эти три метода обязательны для этого класса.<?php
class yandex extends cms_model_search{
public function __construct() {
parent::__construct();
}
public static function getProviderConfig() {
$config = array(
'Адрес для совершения запроса'=>'api_url'
);
return $config;
}
public function prepareSearch() {
return true;
}
}
?>- метод __construct - конструктор класса, запускающий конструктор родителя;
- метод getProviderConfig - должен возвращать настройки провайдера, если таковые имеются. Формат массива настроек должен быть: ключ массива->название опции, значение->имя переменной. Если настроек нет, метод должен возвращать false. Настройки провайдера будут доступны внутри класса через $this->config['ИМЯ_ПРОВАЙДЕРА']['имя_переменной'], т.е. глядя на пример это будет $this->config['yandex']['api_url'].
- метод prepareSearch - должен выполнять непосредственно сам поиск и заносить все результаты поиска по данному запросу в таблицу cms_search. Заносить результаты поиска необходимо при помощи метода модели addResult($result_array). В массиве $result_array должны быть значения
Код PHP:
Разумеется вы можете в классе провайдера переопределить все методы модели компонента search. После написания класса, другого провайдера можно будет переключить в админке, там же появятся его настройки.$result_array['link'] = ''; // основная ссылка на результат $result_array['title'] = ''; // заголовок результата $result_array['place'] = ''; // заголовок места назначения $result_array['placelink'] = ''; // ссылка на место назначения $result_array['description'] = $searchModel->getProposalWithSearchWord($description); // описание результата, прошедшее через метод, который ищет искомые слова в описании $result_array['pubdate'] = $item['pubdate']; // дата публикации найденного материала $result_array['session_id'] = session_id(); // id текущей сессии пользователя
| # 19 сентября 2011 в 00:06 0 | ||
|
| # 19 сентября 2011 в 00:23 0 | ||
|
| # 19 сентября 2011 в 00:47 -3 | |||
|
| # 19 сентября 2011 в 00:50 0 | |||
|
| # 19 сентября 2011 в 01:56 0 | |||
|
| # 19 сентября 2011 в 07:48 0 | |||
|
| # 19 сентября 2011 в 01:02 0 | ||
|
| # 19 сентября 2011 в 01:05 0 |
| # 19 сентября 2011 в 07:50 +1 | |||
|
| # 19 сентября 2011 в 09:37 0 | ||
|
| # 19 сентября 2011 в 09:44 0 |
| # 19 сентября 2011 в 11:50 0 |
| # 19 сентября 2011 в 13:58 0 | ||
|
| # 19 сентября 2011 в 14:20 0 | ||
|
| # 19 сентября 2011 в 14:46 0 | ||
|
| # 19 сентября 2011 в 14:48 0 |
| # 19 сентября 2011 в 14:50 0 | ||
|
| # 19 сентября 2011 в 02:31 0 | ||
|
| # 19 сентября 2011 в 07:51 0 | |||
|
| # 19 сентября 2011 в 04:26 0 |
| # 19 сентября 2011 в 07:53 +1 |
| # 19 сентября 2011 в 20:04 0 | ||
|
| # 19 сентября 2011 в 09:26 0 | ||
|
| # 19 сентября 2011 в 09:32 0 | ||
|
| # 19 сентября 2011 в 10:36 0 | ||
|
| # 19 сентября 2011 в 10:53 0 | ||
|
| # 19 сентября 2011 в 10:56 0 | ||
|
| # 19 сентября 2011 в 12:58 +3 | ||
|
| # 19 сентября 2011 в 13:08 +1 | ||
|
| # 19 сентября 2011 в 22:20 +3 | ||
|
| # 19 сентября 2011 в 23:35 0 | ||||
|
| # 20 сентября 2011 в 00:22 0 | |||
|
| # 21 сентября 2011 в 19:50 0 | ||
|
| # 21 сентября 2011 в 20:10 0 | ||
|
| # 20 сентября 2011 в 01:16 0 | ||
|
| # 20 сентября 2011 в 03:05 0 | ||
|
| # 20 сентября 2011 в 15:53 0 | ||
|
| # 20 сентября 2011 в 15:57 0 | ||
|
| # 20 сентября 2011 в 16:23 0 | ||
|
| # 20 сентября 2011 в 16:18 0 | ||
|
| # 20 сентября 2011 в 16:23 0 | |||
|
| # 20 сентября 2011 в 16:28 0 | ||
|
| # 20 сентября 2011 в 17:23 0 | ||
|
| # 21 сентября 2011 в 19:24 0 | ||
|
| # 21 сентября 2011 в 20:19 0 | ||
|
| # 21 сентября 2011 в 22:19 +1 | ||
|
| # 21 сентября 2011 в 23:47 0 | ||
|
| # 21 сентября 2011 в 23:52 0 | ||
|
| # 20 сентября 2011 в 19:48 0 | ||
|
| # 20 сентября 2011 в 20:42 0 | |||
|
| # 20 сентября 2011 в 22:11 0 | ||
|
| # 20 сентября 2011 в 22:18 0 | |||
|
| # 21 сентября 2011 в 01:22 0 | ||
|
| # 21 сентября 2011 в 01:31 0 | ||
|
| # 21 сентября 2011 в 01:37 0 | ||
|
| # 21 сентября 2011 в 01:31 0 | ||
|
| # 21 сентября 2011 в 01:46 0 | ||
|
| # 21 сентября 2011 в 13:45 0 | ||
|
| # 21 сентября 2011 в 12:20 0 | ||
|
| # 21 сентября 2011 в 15:40 0 | ||
|
| # 21 сентября 2011 в 15:42 0 | ||
|
| # 21 сентября 2011 в 16:01 +2 | ||
|
| # 21 сентября 2011 в 16:09 0 | ||
|
| # 21 сентября 2011 в 22:46 +2 | ||
|
| # 22 сентября 2011 в 00:27 0 | ||
|
| # 21 сентября 2011 в 16:42 0 | ||
|
| # 21 сентября 2011 в 19:19 0 | ||
|
| # 21 сентября 2011 в 19:23 0 | ||
|
| # 21 сентября 2011 в 23:43 0 | ||
|
| # 21 сентября 2011 в 23:57 0 | ||
|
| # 25 сентября 2011 в 13:51 0 | ||
|
| # 25 сентября 2011 в 14:25 0 | ||
|
| # 25 сентября 2011 в 17:21 0 | ||
|
| # 25 сентября 2011 в 19:58 0 | ||
|
| # 7 октября 2011 в 21:50 0 | ||
|
| # 25 сентября 2011 в 21:13 +3 | ||
|
| # 25 сентября 2011 в 21:22 +1 | |||
|
| # 6 октября 2011 в 11:34 0 | ||
|
| # 6 октября 2011 в 14:15 +2 | ||
|
| # 6 октября 2011 в 14:48 0 | ||
|
| # 13 октября 2011 в 17:09 0 | ||
|
| # 16 октября 2011 в 21:03 0 | ||
|
| # 17 октября 2011 в 13:55 0 | ||
|
| # 6 ноября 2011 в 15:58 0 | ||
|
| # 7 ноября 2011 в 19:42 0 | ||
|
| # 7 ноября 2011 в 20:16 0 | |||
|
| # 7 ноября 2011 в 23:28 0 | ||
|
| # 8 февраля 2012 в 01:38 0 | ||
|
