Обновление компонента поиск

+69
73.03K
Итак, добрались наконец у меня руки до поиска по сайту.
Представляю вашему вниманию полностью переделанный компонент "Поиск".
Иллюстрация

Что сделано:

— полностью переписан код компонента, доработан алгоритм поиска;
— поиск выполняется только один раз при первом запросе(изменении запроса), при пагинации результаты берутся из кеша;
— общее снижение нагрузки на БД при поиске;
— заложена возможность использовать своего провайдера для поиска;
— при поиске заложена возможность выбора(чекбоксы) где искать;
— весь html вынесен в шаблоны;
— при поиске по тегу заложена возможность ручного ввода тега с автодополнением;
— добавлена задача cron на очищение таблицы cms_search раз в сутки;
— в результатах поиска теперь помимо заголовка, показывается описание;
— опции расширенного поиска;
— подсветка поисковых слов в выдаче;
— закрыта небольшая уязвимость.

Сразу хочу отметить, что глобально в алгоритме поиска ничего не менялось, было "выжато" максимум из полнотекстового поиска mysql.

Скачать можно отсюда, конкретные изменения можно посмотреть как обычно в траке.

Как установить:

Архив распаковать с заменой на сервере, зайти в админку, в установку дополнений (/admin/index.php?view=install&do=component), нажать обновить компонент Поиск.

Демо можно посмотреть этом сайте.

Как сделать своего провайдера поиска:

Для начала нужно создать в директории /components/search/providers файл с названием ИМЯ_ПРОВАЙДЕРА.php. В этом файле нужно написать одноименный класс — ИМЯ_ПРОВАЙДЕРА.
Пример:
Создаем файл yandex.php, в нем пишем
  1. <?php
  2.  
  3. class yandex extends cms_model_search{
  4.  
  5. public function __construct() {
  6. parent::__construct();
  7. }
  8.  
  9.  
  10. public static function getProviderConfig() {
  11.  
  12. $config = array(
  13. 'Адрес для совершения запроса'=>'api_url'
  14. );
  15.  
  16. return $config;
  17.  
  18. }
  19.  
  20. public function prepareSearch() {
  21.  
  22. return true;
  23.  
  24. }
  25.  
  26. }
  27.  
  28. ?>
Все эти три метода обязательны для этого класса.

— метод __construct — конструктор класса, запускающий конструктор родителя;
— метод getProviderConfig — должен возвращать настройки провайдера, если таковые имеются. Формат массива настроек должен быть: ключ массива->название опции, значение->имя переменной. Если настроек нет, метод должен возвращать false. Настройки провайдера будут доступны внутри класса через $this->config['ИМЯ_ПРОВАЙДЕРА']['имя_переменной'], т.е. глядя на пример это будет $this->config['yandex']['api_url'].
— метод prepareSearch — должен выполнять непосредственно сам поиск и заносить все результаты поиска по данному запросу в таблицу cms_search. Заносить результаты поиска необходимо при помощи метода модели addResult($result_array). В массиве $result_array должны быть значения
  1.  
  2. $result_array['link'] = ''; // основная ссылка на результат
  3. $result_array['title'] = ''; // заголовок результата
  4. $result_array['place'] = ''; // заголовок места назначения
  5. $result_array['placelink'] = ''; // ссылка на место назначения
  6. $result_array['description'] = $searchModel->getProposalWithSearchWord($description); // описание результата, прошедшее через метод, который ищет искомые слова в описании
  7. $result_array['pubdate'] = $item['pubdate']; // дата публикации найденного материала
  8. $result_array['session_id'] = session_id(); // id текущей сессии пользователя
  9.  
Разумеется вы можете в классе провайдера переопределить все методы модели компонента search. После написания класса, другого провайдера можно будет переключить в админке, там же появятся его настройки.
0
Keep Keep 12 лет назад #
Большое спасибо!
0
Malanas Malanas 12 лет назад #
Спасибо,попробуем.
-3
s21 s21 12 лет назад #
Демо можно посмотреть на этом сайте

ссылки не работают
0
Fuze Fuze 12 лет назад #
ссылки не работают
какие ссылки? если те, что выделены зеленым, то они никогда не были кликабельными.
0
s21 s21 12 лет назад #
Демо можно посмотреть на этом сайте

имеется ввиду на сайте инстантцмс.ру?
0
Fuze Fuze 12 лет назад #
имеется ввиду на сайте инстантцмс.ру?
да
0
nikitka nikitka 12 лет назад #
Спасибо за труды!
0
picaboo picaboo 12 лет назад #
http://instantcms.ru/index.php?view=search&query=%F3%E4%E0%EB%E8%F2%FC&look=allwords&from_component%5B%5D=content&from_component%5B%5D=forum&from_component%5B%5D=blogs
ищу "удалить" а подсвечивает "удал" и ищет по корню.
+1
Fuze Fuze 12 лет назад #
ищу "удалить" а подсвечивает "удал" и ищет по корню.
все верно, при выборе "все слова" работает стеммер Портера. Выберите "фраза целиком" и будет вам счастье.
0
picaboo picaboo 12 лет назад #
Хорошее решение. Практически морфологический полноценный
0
Fuze Fuze 12 лет назад #
да, единственный недостаток всего решения в целом это вывод результатов по релевантности, поиск "IN BOOLEAN MODE" не отдает результаты по релевантности в принципе, соответственно отсортировать невозможно. Но несмотря на это, результаты поиска уже гораздо лучше и ближе, чем были раньше.
0
picaboo picaboo 12 лет назад #
тут конечно бы не помешало еще выводить дату поста в списке. поскольку по заголовку не всегда понятно к какой версии движка обсуждение где упоминается искомое слово. а так хотя бы визуально можно отсортировать. я конкретно про этот сайт, искать стало удобнее, а дата - еще бы дружелюбнее поиск сделала.
0
Fuze Fuze 12 лет назад #
сделали. скиньте кеш браузера
0
Zau4man Zau4man 12 лет назад #
А полным пакетом где можно взять?
Я залил http://trac.instantcms.ru/changeset/821 поверх уже установленного, поиск теперь ничего не может найти...
0
Fuze Fuze 12 лет назад #
позже обновлю полный пакет.
вам нужно создать поле pubdate - datatime в таблице cms_search
0
picaboo picaboo 12 лет назад #
а можно попросить еще добавить здесь на сайте в поиск , где у вас формируется урл на поиск в яндексе

параметр
Код PHP:
&site=instantcms.ru&rstr=&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=&to_month=&to_year=&mime=all&numdoc=10&lr=2
тоесть у вас идет
Код PHP:
http://www.yandex.ru/yandsearch?text=
потом вы подставляете поисковый запрос

и закрыть это

Код PHP:
&site=instantcms.ru&rstr=&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=&to_month=&to_year=&mime=all&numdoc=10&lr=2

тогда будет искать не по всему рунету, а конкретно по оффсайту
0
picaboo picaboo 12 лет назад #
даже можно короче. яндекс проглатывает.

вот так

Код PHP:
&site=instantcms.ru&numdoc=10&lr=2
-1
Владимир Владимир 12 лет назад #
Fuze, в версии 1.7 это можно задействовать?
0
Fuze Fuze 12 лет назад #
Fuze, в версии 1.7 это можно задействовать?
можно
0
s21 s21 12 лет назад #
скажите пожалуйста, у меня УНИВЕРСАЛЬНЫЙ КАТАЛОГ заточен под СПРАВОЧНИК ОРГАНИЗАЦИЙ, как сделать так что бы, в окне поиска в том месте где ставится галочка, было написано не универсальный каталог а справочник организаций.

спасибо...
+1
Fuze Fuze 12 лет назад #
как сделать так что бы, в окне поиска в том месте где ставится галочка, было написано не универсальный каталог а справочник организаций.
Заходите в phpmyadmin в таблицу cms_components и переименовывайте как вам нужно.
0
s21 s21 12 лет назад #
Спасибо!
0
pasplus pasplus 12 лет назад #
Спасибо
0
Zau4man Zau4man 12 лет назад #
Аццки плюсую!
0
Thanatognozija Thanatognozija 12 лет назад #
Все работает отлично, спасибо!!!
0
Cleverking Cleverking 12 лет назад #
А как поставить тем у кого есть изменение в файлах шаблона?
0
Fuze Fuze 12 лет назад #
так как написано в самом посте. файлы существующих шаблонов не изменены.
Удостовериться в этом можно тут.
Нужно только в свой файл стилей внести изменения.
+4
Александр Александр 12 лет назад #
У тех у кого свой шаблон проще сделать так:
1. Скачиваем архив
2. Удаляем фаил из архива / com_search_up / templates / _default_ / css / style.css
3. Все теперь заливаем весь архив поверх
4. Далее добавим стили в свой style.css
Код PHP:
/*----------------------------- SITE SEARCH ----------------------------------*/
.search_match{
	background-color:#66CCFF;
	color:#FFF;
    border-radius:2px;
    -moz-border-radius:2px;
	padding:0 2px;
}
#from_search{
	display:none;
	margin:10px 0 0 0;
	border-top:1px #4DA4CF solid;
	position:relative;
}
#from_search label{
	color: #666;
}
#from_search label.selected{
	color: #000;
}
.price_search {
	width: 60%;
	border: 1px solid #666666;
}

.search_input {
	width: 300px;
	border:solid 1px gray;
}
.search_block {
	margin:0 0 7px 0;
	clear:both;
	padding:0 4px 4px;
    border-radius:6px;
    -moz-border-radius:6px;
}
.search_result_title {
	font-size:18px;
}
.search_result_title span {
	width:25px;
	display:block;
	float:left;
}
.search_result_desc {
	margin:4px 0 0 20px;
}
.search_result_desc p {
	color:#666;
}
.search_result_desc a {
	color:#666;
}
Автору большое спасибо
+1
Protomoto Protomoto 12 лет назад #
Ну вот! Молодец! Я обещал - Fuze сделал!
+3
Fuze Fuze 12 лет назад #

Архив обновлен.

- решена проблема с поиском на кириллице на некоторых хостингах;
- добавлен вывод даты публикации материала;
- добавлены параметры поиска.

Для тех, кто уже поставил, необходимо выполнить запрос в phpmyadmin
Код PHP:
ALTER TABLE `cms_search` ADD `pubdate` DATETIME NOT NULL AFTER `date`
и распаковать архив с заменой.
На instantcms.ru все так же обновлено.
0
reload reload 12 лет назад #
Fuze:
Архив обновлен.
Отлично!)
работает как родной) спасибо!
0
Patriot Patriot 12 лет назад #
Архив обновлен.

Спасибо Fuze! На 1.8 полет нормальный!
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
Patriot Patriot 12 лет назад #
Один вопрос по БД. Запрос в phpmyadmin обязательно выполнять? При запросе у меня выдаёт ошибку, хотя компонент работает нормально.
0
Алфей Алфей 12 лет назад #
Все работает на Отлично!!! Спасибо Fuze!!!!
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
Keep Keep 12 лет назад #
А в основном дистрибутиве это обновление есть, или будет?
0
Fuze Fuze 12 лет назад #
это будет в сервисном обновлении 1.8.1, которое выпустим в ближайшее время.
p.s. на вопросы "КОГДА 1.8.1?" ответа не ждите. скоро.
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
Fuze Fuze 12 лет назад #
А в Мапс искать будет ?
будет.
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
+1
Fuze Fuze 12 лет назад #
Тут решение посмотреть или просто скачать и заменить.
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
Михаил Михаил 12 лет назад #
после установки и ввода слова на поиск выдается ошибка:
Fatal error: Cannot redeclare search_catalog() (previously declared in /components/catalog/psearch.php:16) in components/video/psearch.php on line 46

Подскажите в чем может быть проблема
0
Fuze Fuze 12 лет назад #
в обновлении компонента instantvideo, которое выйдет на днях, будет поддержка нового поиска.
previously declared in /components/catalog/psearch.php:16) in components/video/psearch.php on line 46
я не заявлял поддержку поиска в компоненте видео в версии 1.4.
0
livecom livecom 12 лет назад #
Все здорово.
Эх, если бы еще шаблон модуля поиска переделать по аналогии с формой компонента, то была бы вообще песня )
0
Fuze Fuze 12 лет назад #
Эх, если бы еще шаблон модуля поиска переделать по аналогии с формой компонента, то была бы вообще песня )
переделайте себе, кто ж против) тем более, что html вынесен в шаблон.
0
livecom livecom 12 лет назад #
Только вот шаблон модуля в php файле. Если брать за основу шаблон компонента, то немало переделывать придется.
0
artlab artlab 12 лет назад #
шаблон в tpl файле.html вполне доступен. Документация
0
livecom livecom 12 лет назад #
Да я знаю... изучил уже шаблон компонента поиска.
Я о другом говорил. Сам шаблон модуля поиска в файле /modules/mod_search/module.php
Остается либо достаточно немало править, либо писать модуль с нуля и назвать mod_search.tpl
0
livecom livecom 12 лет назад #
Или имеете в виду, писать совсем новый модуль?
0
artlab artlab 12 лет назад #
любой php файл поддерживает html
0
livecom livecom 12 лет назад #
Всем известны эти прописные истины. Но повторяю, речь не об этом.
0
Александр Александр 12 лет назад #
+50 плюсуюсь конечно)) спасибр!
0
livecom livecom 12 лет назад #
Сделал модуль, поиск работает корректно. Только вот столкнулся с адаптацией "расширенного поиска"...
Вот этот отрезок кода из шаблона компонента, как лучше всего интегрировать в модуль?
Код PHP:
<table width="" border="0" cellspacing="0" cellpadding="3">
            {assign var="col" value="1"}
            {foreach key=tid item=enable_component from=$enable_components}
                {if $col==1} <tr> {/if}
                <td width="">
                <label id="l_{$enable_component.link}" {if in_array($enable_component.link, $from_component) || !$from_component}class="selected"{/if}>
                	<input name="from_component[]" onclick="toggleInput('l_{$enable_component.link}')" type="checkbox" value="{$enable_component.link}" {if in_array($enable_component.link, $from_component) || !$from_component}checked="checked"{/if} /> 
                    {$enable_component.title}</label></td>
                {if $col==5} </tr> {assign var="col" value="1"} {else} {math equation="x + 1" x=$col assign="col"} {/if}
            {/foreach}
            {if $col>1} 
                <td colspan="{math equation="x - y + 1" x=$col y=5}">&nbsp;</td></tr>
            {/if}
        </table>
0
livecom livecom 12 лет назад #
Забыл сказать, изменения в файле module.php, а не tpl.
+2
Fuze Fuze 12 лет назад #
Модуль поиска обновлю, в версии 1.8.1 будет. Возможно выложу до релиза.
0
livecom livecom 12 лет назад #
Заранее спасибо )
+2
Fuze Fuze 12 лет назад #
0
artlab artlab 12 лет назад #
Спасибо огромное.Чёт не появляется ссылка "Где искать",хотя в шаблоне присутствует.
0
AlekS AlekS 12 лет назад #
Скажите, а в самих разделах этот поиск ищет? тоесть не по статьям, а именно по разделам? Просто стандартный поиск не видит разделы.
0
Fuze Fuze 12 лет назад #
По названиям разделов поиск не ищет.
0
AlekS AlekS 12 лет назад #
а по материалу (тексту) раздела? просто у меня на страницах разделов много информации важной размещено и хотелось бы чтобы там тоже действовал поиск... А можно ли реализовать такое, чтобы и по названиям разделов искал или это сложно сделать?
0
lezginka.ru lezginka.ru 12 лет назад #
народ, у меня спортивный вопрос:
почему вам нужен родной поиск, яндекс куда релевантней ищет ?
(мне родной поиск нужен, т.к. яща не все индексирует)
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
googlebot googlebot 12 лет назад #
Установил, отличный компонент, ищет прекрасно +++
Небольшой косячок при выводе найденных объектов на карте InstantMaps: дату пишет для всех одинаковую "11 00января", связано наверное с тем, что в таблице cms_map_items тип данных date, а не datetime как везде, как поправить пока не сообразил...
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
Fuze Fuze 12 лет назад #
Написать об этом разработчику и ждать обновления файла поиска видимо...
0
googlebot googlebot 12 лет назад #
Обновил сам, вроде работает, если я нарушаю какую-либо лиц. политику, пожалуйста удалите.
Обновленный psearch.php для компонента карт.
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
+3
Крот Крот 12 лет назад #
Уважаемые форумчане!
"немного" изменил модуль поиска на сайте (взял несколько последних и слил в один)
вот картинка


ОПИСАНИЕ: поиск как в Яндексе на главной - при "тыке" на ссылку сверху происходит поиск по выбранному компоненту, плюс
пример поиска. При нажатии на ссылку настройка поиска - появляется компонент поиска с открытым окном настроек.
если кого-то заинтересует - могу написать пост.
+1
Fuze Fuze 12 лет назад #
если кого-то заинтересует - могу написать пост.
пишите конечно. никто не против полезных постов.
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
artlab artlab 12 лет назад #
))))
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
Katerina Katerina 12 лет назад #
Скажите, а возможно в Ваш поиск добавить "Сортировать по рейтингу". По аналогии с "сортировать по дате публикации"?
0
lezginka.ru lezginka.ru 12 лет назад #
если шаблон не дефолт, какой файл или код менять ?
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
0
lezginka.ru lezginka.ru 12 лет назад #
Олег Васильевич, если
Кому вопрос ?
обращение ко мне, тогда вопрос к любому, кто "не чайник" в данном вопросе
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 12 лет назад #
Комментарий удален
+1
elv elv 5 лет назад #
Доброе время суток. Возможен ли такой поиск для cms 2 и с полнотекстовым поиском Sphinx ? Cпасибо .
0
Loadырь Loadырь 5 лет назад #
Конечно возможен, если вы такое у себя на сервере, провернуть сможете?
0
elv elv 5 лет назад #
Такой поиск - это /search , с "Где искать:" . Такое не проверну сам.
0
elv elv 5 лет назад #
А если нужно много чего делать с сервером, то скорее всего не нужен такой поиск, нужно что-то попроще.
0
Loadырь Loadырь 5 лет назад #
@elv:
с "Где искать:"
Это всего лишь форма. По ссылке, что я дал, это то, что будет происходить после нажатия кнопки "Найти". Другими словами, Sphinx настраивается на уровне серверов, а не php скриптов.
0
elv elv 5 лет назад #
Форма и нужна, чтобы разделить поиск по Типам контента.
0
elv elv 5 лет назад #
+ есть поиск по Дате публикации
0
elv elv 5 лет назад #
Может есть возможность чтобы искало слова до 5 символов ?

Еще от автора

Как собрать обновление и релиз InstantCMS
Небольшой экскурс в сборку дистрибутива установки и обновления InstantCMS с GitHub.
InstantCMS 2.14.0 release candidate
Здравствуйте Тестируем релиз-кандидат InstantCMS 2.14.0. От того, как мы с вами выявим баги в новой версии, зависит стабильность релиза.
Черная пятница, скидки на премиум компоненты
Привет, друзья! Сегодня день, которого многие давно ждали - Черная пятница!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.