Поиск на Drupal 7 с помощью Apache Solr ч.1 — базовая настройка

  • Tutorial

Я хочу написать не просто очередной пост «как прикрутить Солр к Друпалу», а серию подробных постов начиная от базовой настройки и заканчивая фасетами.
На основе ваших комментариев и вопросов я готов включить дополнительный материал в очередной пост.

Список статей:


Несколько преимуществ поиска через Apache Solr перед обычным поиском в Drupal:
  • поиск через Apache Solr работает намного быстрее и не нагружает сервер базы данных
  • гибко настаиваемые параметры поиска
  • сайт проще масштабировать, вы легко можете разместить Apache Solr на соседнем сервере
  • использование фасетов (уточняющий поиск)


Итак в первой части начнем с базовой настройки.

Входные параметры:
Я использую ОС Ubuntu 10.04
За основу я взял Drupal 7.22 и модули для поиска search_api и search_api_solr
Сервер поиска Apache Solr 3.6.1

Список модулей, которые потребуется скачать: search_api, search_api_solr, entity, ctools, views

1. Установка Apache Solr


Скачиваем сервер с официального сайта
Есть и более новая версия Apache Solr 4.x, но файлы схемы в модуле search_api_solr есть только для третьей версии, поэтому следует использовать ее.

Распаковываем скачанный архив в любую удобную для вас папку.
В моем случае это /home/kainz/applications/apache-solr-3.6.1 Для запуска сервера, вам понадобится Java. У меня установлен пакет openjdk-6, вы можете выбрать этот или любой другой, который вам подойдет.

Чтобы запустить сервер нужно в консоли перейти в директорию Apache Solr, а затем в example (в моем случае это /home/kainz/applications/apache-solr-3.6.1/example) и выполнить команду java -jar start.jar.
В случае успешного запуска вы увидите кучу служебной информации и в самом конце сообщение:
«2013-04-05 00:27:09.845:INFO::Started SocketConnector@0.0.0.0:8983» или что-то похожее (зависит от версии).

Если у вас возникнут проблемы совместимости новых версий Apache Solr с модулями Drupal, то можете скачать сервер, который я использовал при написании этого мануала. Он уже настроен и работает.

2. Подключение Apache Solr к Drupal


Сперва устанавливаем модули search_api и search_api solr.

Я использовал search_api_solr 7.x-1.0-rc2 и search_api 7.x-1.4

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

Теперь нужно зайти в модуль search_api_solr и скопировать оттуда два файла — schema.xml и solrconfig.xml в папку с конфигами сервера (в моем случае /home/kainz/applications/apache-solr-3.6.1/example/solr/conf). Эти файлы нужны для того чтобы Drupal мог взаимодействовать с Apache Solr. После того как вы скопируете эти файлы, сервер необходимо перезапустить. Попробуйте перейти по адресу localhost:8983/solr/admin/ чтобы убедиться что поисковый сервер работает.

3. Настраиваем поиск в Drupal


Если вы еще не включили модули search_api и search_api_solr, то включите их и очистите кеш.
На странице admin/config/search/search_api вы сможете создать две сущности — сервер и индекс.
Сервер служит своего рода мостом между Drupal и Apache Solr. В нем хранятся настройки для доступа к серверу Apache Solr.
Индекс позволяет настраивать поиск определенным образом. Вы можете создать несколько индексов для одного сервера. Например разные индексы для разных типов нод.

Итак создадим сервер admin/config/search/search_api/add_server

В качестве класса сервиса выбираем «Solr service». Если вы не можете выбрать класс, то убедитесь что библиотека SolrPHPClient установлена в sites/all/libraries/SolrPHPClient и модуль search_api_solr включен.



Данные сервера, такие как хост, порт и путь подходят для установки по умолчанию. Если сервер настроен правильно, то после отправки формы вы увидите информационное сообщение:



Теперь создадим индекс — admin/config/search/search_api/add_index. Назовем его Node index, в качестве сервера, выбираем созданный нами Solr server. Index items immediately — полезная опция, позволяет индексировать ноды в момент создания (если не выбрать ее то ноды будут индексироваться по крону).



Следующий шаг — выбор полей, по которым будем искать. Пока что выберем только title и сохраним форму. Теперь создаем представление (view) для того, чтобы отображать результаты поиска — admin/structure/views/add. Перед этим необходимо включить модули search_api_views, views, views_ui и ctools.

Для результатов поиска есть специальный тип представлений для модуля views. Выберите ваш индекс — Node index и создайте представление с дисплеем page и настройте его.



Для этого добавим поля Title и Body для вывода. Затем добавим контекстуальный фильтр «Search: Fulltext search» и выберем поле Title в настройках это фильтра. Таким образом поиск будет происходить по полю Title. В дополнение к этому добавим еще exposed filter для того чтобы можно было вводить аргументы поиска через форму.



Сохраняем вьюху. Запускаем индексирование нод, если они еще не проиндексированы на этой странице admin/config/search/search_api/index/node_index/status. Я заранее создал пару нод — статей.

Переходим на страницу /search-results — именно такой адрес я указал для дисплея с типом page.
Сейчас выводятся все ноды, поскольку ключевые слова не указаны.



Так выглядят результаты поиска по ключевым словам.



Заключение


По умолчанию Apache Solr плохо ищет по русским словам. Чтобы это исправить, в файле schema.xml найдите строчки
<!-- <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> -->

и замените их на
<filter class="solr.SnowballPorterFilterFactory" language="Russian" protected="protwords.txt"/>


В процессе разработки, я сталкивался с тем, что последние версии модулей поиска не дружат с последней версией Apache Solr, схема не подходит в последней версии поискового сервера и прочими проблемами совместимости. Поэтому в тексте статьи я указал версии модулей и поискового сервера, которые я использовал. Если у вас будут проблемы с индексированием, попробуйте использовать именно эти версии.
Поделиться публикацией

Комментарии 14

    +2
    Отличная развернутая статья. Тема фасетов не раскрыта, хотя обещана.
      +4
      Об этом будет в следующих частях.
      0
      Интересно, почему любят скрещивать Drupal именно с Solr?
      Был бы интересен анализ работы Drupal c другими движками.
        0
        Например вот прикручивание Сфинкса к шестёрке.
          0
          Почему именно с Solr? Очень давно и часто скрещивают с Sphinx, он тоже лучше того который встроен в Друпал.
          Собственно тот поиск что встроен в ядро Друпала, это база от которой нужно отталкиваться на начальном этапе проектирования сайта, когда нагрузка вырастает, тогда замена поиска это один из шагов улучшения сайта.
            +1
            Да, я знаю про совместимость с Sphinx.
            Я про то, что можно сказать на лицо факт, что если Drupal и сложный поиск, то Solr.
            Поддержа модулями, их качество и количество намного выше для Solr.
            На хостинге Acquia, так же Solr из коробки.
            0
            Возможно, основная причина в том, что сам drupal.org использует solr.
              0
              Фасеты (Facets). Я не уверен правильно ли называть их так, если что поправите.
              Дело в том что в данный момент поддержка фасетов в search_api реализована в solr и database, но в последней поддерживается только оператор and.
              Для многих это ключевая функция, и даже при небольших начальных нагрузок ставится solr.
                0
                Мне кажется логичным ещё использовать поиск встроенный в PostgreSQL.
                  0
                  Я использовал только MySQL, а в PostgreSQL какие то особые фишки для поиска? Я думаю, что апач солр все равно будет быстрее, т.к. он специально заточен именно под поиск.
                    0
                    Да, в PostgreSQL встроен очень гибкий полнотекстный поиск. По нашим тестам оно гораздо лучше работает того же сфинкса. К тому же очень просто настраивается и используется внутри СУБД.
                    www.postgresql.org/docs/9.2/static/textsearch.html

                    PS по данным из солр вам нужно будет ещё вытащить данные из СУБД, а тут всё и сразу. :)
                      0
                      В солре можно готовые результаты хранить. Я видел модуль который умеет отрисованную ноду хранить в солре. Думаю это нормально если не делать поиск по этому полю :)
                        0
                        Ситуации бывают разные, по этому подход PostgreSQL и гибче.
                +1
                Хорошая статья, детально и понятно. Обязательно пишите ещё.

                Спасибо за материал!

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое