Фасетный поиск в Drupal: часть первая

20 Apr, 2014

Часть первая / Часть вторая / Часть третья

Фасетный поиск (он же "умный фильтр") - та самая штука, которую можно видеть в крупных интернет магазинах бытовой техники и электроники: Связном, М-видео, Ситилинке и том же яндекс.маркете. Он позволяет последовательно выбрать товары с нужными свойствами, отсеяв все лишнее. Это мега-удобная вещь, и сейчас некоторые движки интернет магазинов имеют подобный функционал либо в виде модулей, либо 'из коробки'. Пример реализации такого поиска на друпале можно посмотреть в демке Commerce Kickstart.

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

Установка модулей

Для начала нам понадобятся скачать: Search API, Search API Database Search, Entity API и Views.

Установка, используя drush:
$ drush dl search_api search_api_db entity views ctools

На странице модулей включаем:

  • Search API
  • Search views
  • Database search
  • Entity API
  • Views
  • Views UI
  • Ctools

Создание поискового сервера

Идем в Configuration -> Search API и нажимаем Add server.
Вводим имя сервера (я назвал его 'Database server'), в выпадающем списке Service class выбираем Database service и сохраняем.
Create search server

Создание индекса

Идем в Configuration -> Search API, жмем Add index.
Вводим название индекса (я назвал 'Product index'), Item type выбираем 'Node', в списке серверов выбираем созданный в предыдущем шаге Database server, жмем Create index.
Create index

В открывшейся форме выбираем поля, по которым будет производится поиск, сохраняем.
Хинт: чтобы можно было в дальнейшем делать сортировку по названию ноды, включаем title и напротив него в выпадающем списке выбираем тип string, а не fulltext. По fulltext сортировку делать нельзя.
Выбор полей для индексирования

В следующей открывшейся форме (workflow) я ничего не менял, a перешел на вкладку Status (Просмотр), и нажал Index Now (Проиндексировать сейчас).
Наш контент проиндексирован, теперь создадим страницу поиска.
Проиндексированный контент

Создание страницы поиска

Идем в Structure -> Views и жмем Add new view.
В открывшейся форме в выпадающем списке Show выбираем наш ранее созданный индекс (в данном случае Product index), остальные поля (название, title и путь) заполняете по своему усмотрению.
Создание нового представления
Далее нажимаем Continue & edit и настраиваем вьюху как обычно. Я добавил в критерии фильтрации показ только опубликованных материалов и нужный тип ноды, ну и настроил отображение необходимых полей (вы должны добавить эти поля в индекс, чтобы иметь возможность фильтровать по ним).
Настройка представления

На этом создание вьюхи можно считать законченым, далее перейдем непосредственно к фасетному фильтру.

Часть первая / Часть вторая / Часть третья

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.