Всем привет.
Как и обещал, расскажу, как включить возможность поиска по части слова, а не по целому. Дело в том, что по умолчанию Solr не понимает wildcard (не знаю, как это слово правильно перевести на русский). Извращается народ по разному, но, фактически, правильное решение одно - установка Solr версии 3.х. Дело в том, что в Solr 3-ей версии по умолчанию есть обработчик поисковых запросов Extended DisMax (edismax), в то время, как в Solr 1.x - обычный DisMax. Поддержка Solr 3.х в модуле Apachesolr Search Integration, насколько я знаю, достаточно давно сделана, поэтому даже не пишу, с какой версии ниженаписанное актуально. По большей части заметка будет об установке Solr 3.x. Итак, поехали.
Скажу сразу, что я использую debian-based системы и устанавливал и запускал Solr успешно только на них. В Ubuntu, к примеру, Solr 1-ой версии можно поставить из репозиториев, а запускаться он будет с помощью Jetty. С Solr 3-ей версии немного сложнее, после того, как я перерыл кучу заметок об установке, нашёл одну кошерную (источник не могу найти, если найду - будет ссылка), ниже мой доработанный вариант.
1. Скачать Solr. Замечу, что до версии 3.6.0 были жалобы, что все запросы должны быть в нижнем регистре, чтобы корректно парсился wildcard, но в 3.6.0 это исправлено. Вот тут список зеркал.
2. Распаковать.
mv apache-solr-3.6.0 solr
3. Скопировать дистрибутив туда, откуда он будет работать. Лично у меня это /var/lib/solr:
4. Никаких посторонних сервисов для Solr не надо, там в дистрибутиве уже есть jetty. Наша задача лишь сделать Solr сервисом. Для начала проверить, что Solr корректно запускается:
java -jar start.jar
Если в браузере по адресу http://localhost:8983/solr открывается приветствие солра, значит мы на верном пути. (О том, что нужна джава, я надеюсь, никто не забыл).
5. Создать скрипт для управления solr'ом как сервисом:
Вставлить туда следующее содержимое (не забудьте подправить под себя):
### BEGIN INIT INFO
# Provides: solr
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive: true
# Short-Description: Start/stop solr search system
### END INIT INFO
set -e
SOLR_DIR="/var/lib/solr/example"
JAVA_OPTIONS="-Xmx1024m -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -jar start.jar"
LOG_FILE="/var/log/solr.log"
JAVA="/usr/bin/java"
case $1 in
start)
echo "Starting Solr"
cd $SOLR_DIR
$JAVA $JAVA_OPTIONS 2> $LOG_FILE &
;;
stop)
echo "Stopping Solr"
cd $SOLR_DIR
$JAVA $JAVA_OPTIONS --stop
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}" >&2
exit 1
;;
esac
6. Выставить права:
7. Теперь нужно сообщить системе об этом скрипте. В дебиане я делал это с помощью chkconfig, в убунте - через update-rc.d:
update-rc.d solr defaults
# Вариант для Debian
apt-get install chkconfig
chkconfig solr on
8. Ну и, собственно, проверить, запускается ли Solr. Если запускается, то все сделано правильно (проверять в браузере по адресу http://localhost:8983/solr).
9. Дальше нужно настроить Solr. Учитывая, что мы работаем с ним из Drupal'а, первым делом скопировать schema.xml и solrconfig.xml:
cp /path_to_apachesolr_module/solr-conf/schema-solr3x.xml /var/lib/solr/example/solr/conf/schema.xml
service solr restart
10. И уже опционально - я обычно меняю порт на 8888 (привык просто), делается это в файле /var/lib/solr/example/etc/jetty.xml, там найти строку
<Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
и поменять порт.
Итак, у нас есть работающий Solr версии 3.х. В друпале рекомендуется удалить весь индекс и проиндексировать все заново (схема для 1.х и 3.х версий разная). Теперь, все, что осталось сделать - сообщить друпалу, чтобы он вызывал не старый парсер запросов, а нужный нам edismax. Достаточно лишь один раз выполнить следующий код:
apachesolr_environment_variable_set($env_id, 'apachesolr_query_type', 'edismax');
Готово. Можете проверять - поиск должен корректно обрабатывать символ '*' и искать куски слов.
В следующем посте думаю написать о виджетах для отображения фасетов в Facet API.
Ссылки:
Часть 1. О добавлении полей в индекс и фасетах.
Часть 2. О подмене коллбэка для индексации определенного полям и о том, как искать по дополнительным полям.
Часть 3. О том, как не индексировать, если не хочется.
Комментарии
+
интересно
Я полагаю, что это можно в конфиге поправить, либо еще как-нить...
с другой стороны можно для драша скриптец написать для
drush scr solr_ex.php
Конечно. Можно хоть ручками в базе значение поставить, оно один раз меняется и все.
А так, вообще, ребята, наверное, когда-нибудь в админке заделают опцию, чтобы оттуда менять.
Дык можно закинуть патч - дополнительная галка в настройках сервера будет полезна
Даже нужно, просто сейчас какая-то катастрофическая нехватка свободного времени для контрибьютинга.
Даже вон пятую часть все никак не соберусь написать.
большое спасибо. Очень помогло!
Огромная благодарность за статьи!!! Очень помогли!