Работа с Facet API и Apache Solr. Часть 4

Главные вкладки

Аватар пользователя gWashington gWashington 6 мая 2012 в 2:08

Всем привет.

Как и обещал, расскажу, как включить возможность поиска по части слова, а не по целому. Дело в том, что по умолчанию 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 это исправлено. Вот тут список зеркал.

wget http://apache.mirrors.lucidnetworks.net/lucene/solr/3.6.0/apache-solr-3.6.0.zip

2. Распаковать.

unzip apache-solr-3.6.0.zip
mv apache-solr-3.6.0 solr

3. Скопировать дистрибутив туда, откуда он будет работать. Лично у меня это /var/lib/solr:

mv solr /var/lib/solr

4. Никаких посторонних сервисов для Solr не надо, там в дистрибутиве уже есть jetty. Наша задача лишь сделать Solr сервисом. Для начала проверить, что Solr корректно запускается:

cd /var/lib/solr/example
java -jar start.jar

Если в браузере по адресу http://localhost:8983/solr открывается приветствие солра, значит мы на верном пути. (О том, что нужна джава, я надеюсь, никто не забыл).

5. Создать скрипт для управления solr'ом как сервисом:

nano /etc/init.d/solr

Вставлить туда следующее содержимое (не забудьте подправить под себя):

#!/bin/sh
### 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. Выставить права:

chmod 755 /etc/init.d/solr

7. Теперь нужно сообщить системе об этом скрипте. В дебиане я делал это с помощью chkconfig, в убунте - через update-rc.d:

# Вариант для Ubuntu
update-rc.d solr defaults

# Вариант для Debian
apt-get install chkconfig
chkconfig solr on

8. Ну и, собственно, проверить, запускается ли Solr. Если запускается, то все сделано правильно (проверять в браузере по адресу http://localhost:8983/solr).

service solr start

9. Дальше нужно настроить Solr. Учитывая, что мы работаем с ним из Drupal'а, первым делом скопировать schema.xml и solrconfig.xml:

cp /path_to_apachesolr_module/solr-conf/solrconfig-solr3x.xml /var/lib/solr/example/solr/conf/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. Достаточно лишь один раз выполнить следующий код:

$env_id = apachesolr_default_environment();
apachesolr_environment_variable_set($env_id, 'apachesolr_query_type', 'edismax');

Готово. Можете проверять - поиск должен корректно обрабатывать символ '*' и искать куски слов.

В следующем посте думаю написать о виджетах для отображения фасетов в Facet API.

Ссылки:
Часть 1. О добавлении полей в индекс и фасетах.
Часть 2. О подмене коллбэка для индексации определенного полям и о том, как искать по дополнительным полям.
Часть 3. О том, как не индексировать, если не хочется.

Комментарии

Аватар пользователя andypost@drupal.org andypost@drupal.org 28 мая 2012 в 22:19

"gWashington" wrote:
$env_id = apachesolr_default_environment(); apachesolr_environment_variable_set($env_id, 'apachesolr_query_type', 'edismax');

Я полагаю, что это можно в конфиге поправить, либо еще как-нить...
с другой стороны можно для драша скриптец написать для drush scr solr_ex.php

Аватар пользователя gWashington gWashington 28 мая 2012 в 22:29

<a href="mailto:andypost@drupal.org">andypost@drupal.org</a> wrote:
"gWashington" wrote:
$env_id = apachesolr_default_environment(); apachesolr_environment_variable_set($env_id, 'apachesolr_query_type', 'edismax');

Я полагаю, что это можно в конфиге поправить, либо еще как-нить...
с другой стороны можно для драша скриптец написать для drush scr solr_ex.php

Конечно. Можно хоть ручками в базе значение поставить, оно один раз меняется и все.
А так, вообще, ребята, наверное, когда-нибудь в админке заделают опцию, чтобы оттуда менять.

Аватар пользователя andypost@drupal.org andypost@drupal.org 28 мая 2012 в 23:23

gWashington wrote:

Конечно. Можно хоть ручками в базе значение поставить, оно один раз меняется и все.
А так, вообще, ребята, наверное, когда-нибудь в админке заделают опцию, чтобы оттуда менять.

Дык можно закинуть патч - дополнительная галка в настройках сервера будет полезна

Аватар пользователя gWashington gWashington 28 мая 2012 в 23:26

<a href="mailto:andypost@drupal.org">andypost@drupal.org</a> wrote:
gWashington wrote:

Конечно. Можно хоть ручками в базе значение поставить, оно один раз меняется и все.
А так, вообще, ребята, наверное, когда-нибудь в админке заделают опцию, чтобы оттуда менять.

Дык можно закинуть патч - дополнительная галка в настройках сервера будет полезна

Даже нужно, просто сейчас какая-то катастрофическая нехватка свободного времени для контрибьютинга. Smile
Даже вон пятую часть все никак не соберусь написать.