Устанавливаем Apache Solr Search на Drupal

Итак приступим к установке Apache Solr Search на Drupal.

Здесь я подразумеваю, что Search API и Search API Solr вы уже установили. Помимо модулей, необходимо установить библиотеку SolrPHPClient. Скачанную библиотеку необходимо раскпаковать в папку sites/all/libraries/SolrPHPClient на вашем Drupal сайте.

Качаем с официального сайта дистрибутивЯ качал версию 4.3.1, хотя во многих инструкциях в интернете советуют ставить 3.6.x, по причине плохой совместимости ветки 4.x с Search API друпала. У меня отлично заработала 4.3.1, так что не парьтесь по этому поводу :-) Текущая версия Solr 4.8.1

Итак, качаем и распаковываем в любую удобную директорию нашей Linux установки. Это может быть /opt или /usr/local или любая другая на ваше усмотрение. Распаковать можно вот так:

tar -xzvf solr-4.8.1.tgz

Теперь нам нужно скопировать файлы конфигурации из папки search_api_solr/solr-conf/4.x/ в папку solr/example/solr/collection1/conf. Здесь не жадничаем и копируем поверх все файлы!

Здесь есть небольшое замечание по поводу версий Solr 4.3: Для search_api_solr версии 1.5 ничего делать не надо

Поисковое приложение в Solr 4.3+ на данный момент полностью не поддерживается файломи конфигурации в модуле Search API Solr из-за изменения структуры директорий. Чтобы это исправить, нужно скопировать, переместить или сделать symlink папки contrib/ из корневой директории установки Solr на один уровень ниже в папку example.

Для запуска сервера Solr нам понадобится Java машинка. Как её установить описано здесь

Для удобства запуска, остановки и рестарта создаем скрипт в папке /etc/init.d/ с именем solr. В него прописываем следующее:

  1. #!/bin/sh -e
  2.  
  3. # Starts, stops, and restarts solr
  4. #!/bin/sh -e
  5.  
  6. #chkconfig: 2345 95 20
  7. #description: apache-solr
  8. #processname: solr
  9.  
  10. SOLR_DIR="/папка_установки_solr/example"
  11. JAVA_OPTIONS="-Xmx1024m -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -jar start.jar"
  12. LOG_FILE="/log/solr/solr.log"
  13. JAVA="/usr/bin/java"
  14.  
  15. case $1 in
  16.     start)
  17.         echo "Starting Solr"
  18.         cd $SOLR_DIR
  19.         $JAVA $JAVA_OPTIONS 2> $LOG_FILE &
  20.         ;;
  21.     stop)
  22.         echo "Stopping Solr"
  23.         cd $SOLR_DIR
  24.         $JAVA $JAVA_OPTIONS --stop
  25.         ;;
  26.     restart)
  27.         $0 stop
  28.         sleep 1
  29.         $0 start
  30.         ;;
  31.     *)
  32.         echo "Usage: $0 {start|stop|restart}" >&2
  33.         exit 1
  34.         ;;
  35. esac

Даём права. Добавляем в автозагрузку и стартуем, как советовала нам Наталья «морская пехота»

  1. chmod 755 /etc/init.d/solr
  2. chkconfig --add solr
  3. /etc/init.d/solr start

Тут мы увидем много служебной информации которая должна завершиться строчкой:

Started SocketConnector@0.0.0.0:8983

Проверить работу сервера можно посетив адрес http://здесь_адрес_вашего_сайта:8983/solr

Лучше всего сразу закрыть доступ к этой админке включив файрвол в ispconfig или добавив вот такие правила в iptables

  1. iptables -A INPUT -p tcp -s localhost --dport 8983 -j ACCEPT
  2. iptables -A INPUT -p tcp --dport 8983 -j DROP

Если доступ в админку все-таки нужен, то можно его запаролить. Как это сделать описано ниже.

В файл example/etc/jetty.xml добавляем следующий код

  1. <Call name="addBean">
  2.   <Arg>
  3.         <New class="org.eclipse.jetty.security.HashLoginService">
  4.           <Set name="name">Test Realm</Set>
  5.           <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
  6.           <Set name="refreshInterval">0</Set>
  7.         </New>
  8.   </Arg>
  9. </Call>

Редактируем файл example/etc/webdefault.xml и меняем часть кода в самом конце

  1.   </locale-encoding-mapping-list>
  2.  
  3.  <security-role>
  4.     <role-name>user</role-name>
  5.   </security-role>
  6.   <login-config>
  7.     <realm-name>Auth</realm-name>
  8.   </login-config>
  9.   <security-constraint>
  10.     <web-resource-collection>
  11.       <web-resource-name>File Upload</web-resource-name>
  12.       <url-pattern>/*</url-pattern>
  13.     </web-resource-collection>
  14.     <auth-constraint>
  15.       <role-name>user</role-name>
  16.     </auth-constraint>
  17.   </security-constraint>
  18.  
  19. <!--  <security-constraint>
  20.    <web-resource-collection>
  21.      <web-resource-name>Disable TRACE</web-resource-name>
  22.      <url-pattern>/</url-pattern>
  23.      <http-method>TRACE</http-method>
  24.    </web-resource-collection>
  25.    <auth-constraint/>
  26.  </security-constraint>
  27. -->
  28. </web-app>

Создаем файл example/etc/realm.properties и вписываем в него имя пользователя, пароль и роль. Лучше всего пароль зашифровать

  1. #
  2. # This file defines users passwords and roles for a HashUserRealm
  3. #
  4. # The format is
  5. #  <username>: [, ...]
  6. #
  7. # Passwords may be clear text, obfuscated or checksummed.  The class
  8. # org.mortbay.util.Password should be used to generate obfuscated
  9. # passwords or password checksums
  10. #
  11. # If DIGEST Authentication is used, the password must be in a recoverable
  12. # format, either plain text or OBF:.
  13. #
  14. jetty: MD5:164c88b302622e17050af52c89945d44,user
  15. admin: CRYPT:ad1ks..kc.1Ug,server-administrator,content-administrator,admin
  16. other: OBF:1xmk1w261u9r1w1c1xmq
  17. plain: plain
  18. user: password
  19.  
  20. # This entry is for digest auth.  The credential is a MD5 hash of username:realmname:password
  21. digest: MD5:6e120743ad67abfbc385bc2bb754e297

Перезапускаем Solr и проверяем… Так же нужно будет вписать пароль в настройки Solr Search модуля Drupal.

В принципе это всё, теперь заходим в админку Search API и добавляем новый сервер типа «Solr». К нему прикручиваем индекс и вперёд в бой :-)

Но есть тут один нюанс, из коробки не будет работать столь желанный нами Fuzzy Search!

Пофиксить это можно так: открываем файл schema.xml, расположеный в папке solr-4.3.1/example/solr/collection1/conf ищем там раздел

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">

и добавляем строку

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" />

прямо перед строкой

<filter class="solr.WordDelimiterFilterFactory"

закачиваем назад на сервер и вуа-ля, Fuzzy Search рпаботает!

Так же некоторые предлагают заменить English на Russian в строке

<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>

для лучшего поиска по русским словам. Здесь я ничего не могу сказать, поскольку использую Russian stemming, он сам по себе по-русски ищет очень хорошо :-)

Есть еще один вариант «стемминга» для Solr. Добавляем вот такую строку:

<filter class="solr.RussianLightStemFilterFactory"/>