Sphinx. Модуль поиска (ver.2)

Вы прочли и применили предыдущую статью на практике? Отлично! Значит прямо сейчас вы сможете добавить функцию поиска на свой сайт :-)
Для начала необходимо скачать дистрибутив модуля и распаковать полученный архив в корень движка с учетом путей файлов. [update: архив перезалит — версия 2.1, описание — в комментарии]

Итак, основная часть работы уже сделана, осталось совсем чуть-чуть:
1. в настройки маршрутизатора движка (config/config.route.php) нужно добавить описание класса-обработчика экшена search, для этого добавьте в секцию 'page' код:
'search' => 'ActionSearch',


2. Для более красивого вывода результатов поиска (разумеется, вид поисковой выдачи вы можете настроить по желанию, в этом случае имейте в виду, что в сниппетах ключевые слова оборачиваются в контейнер с CSS-классом searched-item) в главный CSS-файл сайта (global.css) добавьте следующее:
/* Поиск... */
.searched-item { background: #fffacd; }
#sub-nav {
	clear: both;
}
#sub-nav li {
	display: inline;
	margin-right: 3px;
}
#sub-nav li a {
	font-family: Arial, sans-serif;
	font-size:1.083em; /*13px*/
	text-decoration: none;
	color:#093;
	padding: 0 2px;
}
#sub-nav .current a {
	color:#fff;
	background-color: #ff9525;
}


Вот вообщем-то и все, о найденных ошибках, багах и других глюках желательно отписываться в комментариях к этому топику.

UPD(ort): поиск протестировать можно здесь — http://livestreet.ru/search/

51 комментарий

avatar
чтобы добавить посковую форму на все страницы, достаточно в шаблон header вставить код формы с обработчиком /search/topics, либо /search/comments (в зависимости от того какой тип объектов вы хотите искать по-умолчанию) и обязательным полем с именем q — текст запроса.
avatar
отлично! пойду ставить сфинкс и тестить :)
кстати, ты не забыл в архив сфинксапи положить?
  • ort
  • +2
avatar
аааа, забыл. сорри :))
перезалил, топик обновил
avatar
Урааа, отлично :-* Пойду насиловать свой проект :)
avatar
лучше его потестировать всякими заковыристыми запросами (несколько слов и тп) побольше.

в процессе тестирования оказалось, что при запросах, состоящих из русских и не_русских слов иногда всякие неожиданности находятся при включенной морфологии :)
avatar
а демо есть где? себе пока не могу установить, но с удовольствием потестил бы
avatar
нету, можно попросить ОРТа, чтобы он на test.livestreet.ru модуль поставил
avatar
выложите пожалуйста статью установки свинкса на денвер
avatar
Скачайте бинарную сборку Сфинкса для винды sphinx-0.9.8.1-win32.zip с оф. сайта, а затем по статье (<a href=«http://livestreet.ru/blog/dev_documentation/366.html»линк) с адаптацией по винду.

Аргументы вызова сфинксовых бинарников у *nix и win версий совпадают, только пути в конфиге, возможно, придется поменять.
avatar
я читала, только не поняла как установить его и запустить, там же под *nix
avatar
Я так понял нужно иметь рутовый доступ к серверу, чтобы установить приложение сфинкс, а это могут позволить себе только на VDS/VPS или на собственном сервере. А что делать остальным, у которых сайты на обычном виртуальном хостинге? Просить саппорт хостинга установить сфинкс или как? Я не думаю, что хостеры будут выполнять такие просьбы пользователей, хотя может и сделают. Еще такой вопрос, этот сфинкс достаточно установить на основном хостинге и все или для всех виртуальных хостов тоже что нибудь надо настраивать?
avatar
в конфиге описываются индексы, которые являются специфичными для каждой базы данных. т.е. для каждого сайта в конфиг надо вписывать описания индексов
avatar
Ребята, ответьте кто нибудь кто знает по существу моего вопроса выше.
avatar
тут лучше сразу спросить у конкретного хостера и не гадать
avatar
посмотреть поиск можно здесь http://livestreet.ru/search/
  • ort
  • +1
avatar
отлично, отлично ищет.
пожелания
1) чтобы форма поиска была на каждой странице или во всплывающем окне (по типу загрузки картинок)
2) там сложно сделать подсветку искомого слова? а то нечитабельно
avatar
только какаято ерунда с именами :) Макс нашел, Лора нет, Дима так вообще ошибку выдал ;)
avatar
так фразы не ищет, с морфологией одного слова тоже какието проблемы бывают, беру любой топик, выбираю заковыристое слово в топике или комментарии — не находит… а то и ошибку «какието проблемы» выдает.
avatar
можно примеры слов?
avatar
avatar
благодарю
avatar
а ты уверен, что слово «Дима» есть в топиках или комментариях?

выдавание ошибки — не ошибка, а не совсем правильное детектирование отсутствия результатов, поправлю.
avatar
вообщем, найдено уже несколько багов. буду исправлять.

выдаваемые результаты поиска от модуля не зависят — все делает сам сфинкс, просто надо лучше поиграться с настройками его морфологического движка, чем я и займусь.
avatar
Версия 2 :)

Изменения в модуле:
0. Добавлен функционал — если объектов требуемого типа не найдено, но найдены другие — выводится «то, что есть»
1. Пофиксен вывод количества найденных объектов (был «баг» — в случае Черновика, топик считался, но не выводился. с комментарием аналогично)
2. Выдача сообщений не найдено/ошибка. Теперь пишется то, что на самом деле имеет место быть :)
3. Мелкие исправления — передача в API движка лишних параметров и пробел в конце файла с экшеном.

Изменения в конфигурации Сфинкса:
1. Добавлено полное удаление тегов (вместе с содержимым) style и script при индексаци.
Найдите в своей конфигурации строку «html_strip = 1» и сразу после нее вставьте «html_remove_elements = style, script». Данный параметр встречается в конфигурации не менее двух раз.

2. Исправлен тип атрибутов topic_publish и comment_delete при их интерпретации Сфинксом.
Строку «sql_attr_bool = topic_publish» замените на «sql_attr_uint = topic_publish» и «sql_attr_bool = comment_delete» на «sql_attr_uint = comment_delete»

3. Настройка морфологии немного изменена.
Найдите все вхождения строки «morphology = stem_enru, soundex, metaphone» (встречается минимум дважды) и замените на «morphology = stem_enru»

Исключенные два морфо-движка (soundex, metaphone) генерируют из строки код на основе звучания каждого слова, что позволяет, например, находить документы с орфографическими ошибками в словах, однако такой функционал иногда работает не верно, что может привести к неожиданным и неверным результатам.

PS: архив с модулем перезалит на Я.Диск
avatar
конфиг писал по первому топику
html_strip = 1
встречается только 1 раз у топиков
avatar
обновленный поиск можно протестировать здесь — http://livestreet.ru/search/
  • ort
  • +1
avatar
заметил, что установленный тута класс вьюеер не поддерживает подстановку get-параметров и переход по страницам не работает ;)
avatar
исправил
avatar
да, парни, все супер! пока ищет все и вся :)
немного считать не умеет, но это мелочи :)) молодцы, хорошая работа!
avatar
Очередное нано-исправление: при указании страницы (руками) больше, чем всего найдено сыпались ошибки.
Скачать v.2.01 — SphinxSearch.Module.v2.01.zip
Из архива достаточно переписать файл ActionSearch.class.php
avatar
Пытаюсь понять, метод Topic_GetTopicsByArrayId определен в каком классе?
avatar
методы в ЖУ именуются так: модуль_МетодКлассаМодуля, значит в классе топик (/classes/modules/topic/Topic.class.php ;)

Такой метод (и аналогичный для комментариев) появился в 82-м коммите в сабвершене.
avatar
Оу, в таком случае прийдется ждать релиза 0.2, так как я еще не переходил с 0.1.2. Спасибо :)
avatar
а че его ждать ?) оно уже :)) тут
avatar
Пардон, запутался, имел ввиду конечно же новогодний релиз, с новым шаблоном :)
avatar
на самом деле, можно безболезненно накатить изменения из 82коммита, т.к. это первое изменение после среза версии 0.2 и в нем ничего, кроме добавленных пары модулей этих и слегка подгрученного вьюера не изменилось по сравнению с 0.2 (в том числе БД и прочее)
avatar
хм, странно, все сделал как описано, индексиреутся вроде все, но вот результаты ни какие не выдает, мол (Удивительно, но поиск не дал результатов)

Подскажите.
avatar
а демон searchd запущен?
avatar
ооо, вот это я тупанул, дааааа… Спасибо! :)
avatar

Искать ищет, только по адресу ((http://___.ru/search/topics/?q=они), а вот по этому ошибка (http://___.ru/search/topics/?q=они)

Fatal error: Uncaught exception 'Exception' with message 'Не найден класс модуля — GetTopicsByArrayId' in /home/www/myblog2/classes/engine/Engine.class.php:95 Stack trace: #0 /home/www/myblog2/classes/engine/Engine.class.php(140): Engine->LoadModule('GetTopicsByArra...', true) #1 /home/www/myblog2/classes/engine/Module.class.php(37): Engine->_CallModule('GetTopicsByArra...', Array) #2 [internal function]: Module->__call('GetTopicsByArra...', Array) #3 /home/www/myblog2/classes/engine/Engine.class.php(144): eval()'d code(1): Topic->GetTopicsByArrayId(Array, NULL, -1) #4 /home/www/myblog2/classes/engine/Engine.class.php(144): eval() #5 /home/www/myblog2/classes/engine/Action.class.php(268): Engine->_CallModule('Topic_GetTopics...', Array) #6 [internal function]: Action->__call('Topic_GetTopics...', Array) #7 /home/www/myblog2/classes/actions/ActionSearch.class.php(37): ActionSearch->Topic_GetTopicsByArrayId(Array, NULL, -1) #8 /home/www/myblog2/classes/engine/Action.class.php(103): eval()'d code(1): Act in /home/www/myblog2/classes/engine/Engine.class.php on line 95
avatar
поправка
(Искать ищет, только по адресу ((http://___.ru/search/comments/?q=они), а вот по этому ошибка (http://___.ru/search/topics/?q=они))
avatar
интересную особенность обнаружил, если ввести в строку адреса (http://_____.ru/comments/) то открывается отдельная страница с прямым эфиром в стиле результатов поиска. ))))
avatar
ссылка на такую страницу есть на главной… («весь прямой эфир» под блоком последних комментариев)

а по поводу ошибки поика по комментариям, у тебя какая версия ядра ЖУ?
avatar
2.0 ставил
avatar
слушай, а ты его взял? дай дистриб :)

если имел в виду 0.2, то все понятно — метод GetTopicsByArrayId у объекта Topic появился только в коммите №82.

его тебе и нужно накатить (см. ветку комментариев от этого). мог бы обсуждение и прочитать ;) не так это и долго.
avatar
ковырял ковырял… натворил делов, но все заработало УРА, я имею ввиду поиск,
но теперь появилась казявка
вверху — Notice: Use of undefined constant SITE_KEYWORDS — assumed 'SITE_KEYWORDS' in /home/www/myblog2/classes/engine/Engine.class.php on line 97
avatar
а коммиты из сабвершена надо накатывать с умом :) периодически там появляются новые конфигурационные контанты, которые надо внести в существующие конфиги.

SITE_KEYWORDS и еще одна какая-то, насколько я помню, как раз были добавлены в одном из коммитов.
avatar
конСтанты разумеется. клавиатура грязюкой забилась :(
avatar
О, починил, спасибо за подсказку… :)
avatar
странная проблема
в консоли поиск работает и везде ищет
а вот на сайте происходит поиск только по комментам
в логах:
[Tue Apr  7 12:52:14.732 2009] 0.000 sec [all/3/ext 1 (0,20)] [commentsIndex] 123
[Tue Apr  7 12:54:36.138 2009] 0.000 sec [all/2/ext 0 (1,1)] [commentsIndex] russia
[Tue Apr  7 12:54:51.408 2009] 0.000 sec [all/2/ext 0 (1,1)] [commentsIndex] test
[Tue Apr  7 12:55:18.673 2009] 0.000 sec [all/2/ext 1 (1,1)] [commentsIndex] piw
[Tue Apr  7 12:55:18.998 2009] 0.000 sec [all/2/ext 1 (1,1)] [commentsIndex] test
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.