Назад к блогу

Как создать процессорный плагин Search API, совместимый с Solr, в Drupal 10

2023-08-296 мин чтения

В Drupal интеграция с Solr для мощной поисковой функциональности является распространенной практикой. Иногда вам может потребоваться объединить информацию из нескольких полей для создания нового пользовательского поля для поиска Solr. Это руководство покажет вам, как создать процессорный плагин Search API, совместимый с Solr, в Drupal 10. Это руководство также совместимо с Drupal 8 и 9.

Предварительные требования

  1. Рабочая установка Drupal 8, 9 или 10
  2. Поисковая система Solr, интегрированная с Drupal
  3. Пользовательский тип контента с именем Club с пользовательским полем field_cl_district_name. (Примечание: поле title является свойством по умолчанию для любого типа контента Drupal. Для целей этой статьи к типу контента добавлено пользовательское поле для названия района. Вы должны создать или использовать фактический тип контента, соответствующий вашему проекту.)
  4. Установленный и включенный модуль Search API Drupal
  5. Установленный и включенный модуль Search API Solr
  6. Пользовательский модуль с именем my_custom_module (вы можете назвать его как угодно)

Совместимость с Solr

Это руководство разработано для совместимости с Solr, одним из самых популярных поисковых бэкендов, используемых с Drupal. Пользовательский процессорный плагин Search API, который вы будете создавать, может быть настроен для бесшовной работы с Solr, улучшая возможности поиска вашего сайта.

Создание процессорного плагина Search API

Шаг 1: Подготовка вашего пользовательского модуля

Если вы еще не создали пользовательский модуль, вам нужно сначала настроить его. Создайте папку в modules/custom с именем my_custom_module. Внутри нее вам понадобится файл my_custom_module.info.yml со следующим содержимым:

name: 'My Custom Module'
type: module
description: 'A custom module to extend Drupal functionalities.'
core_version_requirement: ^8 || ^9 || ^10
package: Custom

Шаг 2: Создание класса плагина

Создайте PHP-файл с именем FullClubName.php внутри modules / custom / my_custom_module / src / Plugin / search_api / processor.

Вот как будет выглядеть файл FullClubName.php:

<?php

namespace Drupal\my_custom_module\Plugin\search_api\processor;

use Drupal\search_api\Datasource\DatasourceInterface;
use Drupal\search_api\Processor\ProcessorPluginBase;
use Drupal\search_api\Item\ItemInterface;
use Drupal\search_api\Processor\ProcessorProperty;

/**
 * @SearchApiProcessor(
 *   id = "full_club_name",
 *   label = @Translation("Full Club Name"),
 *   description = @Translation("Combine Title and District fields for clubs."),
 *   stages = {
 *     "add_properties" = 0,
 *   },
 *   locked = true,
 *   hidden = true,
 * )
 */
class FullClubName extends ProcessorPluginBase {

  public function getPropertyDefinitions(DatasourceInterface $datasource = NULL) {
    $properties = [];

    if (!$datasource) {
      $definition = [
        'label' => $this->t('Full Club Name'),
        'description' => $this->t('Combines the Title and District fields for clubs.'),
        'type' => 'string',
        'processor_id' => $this->getPluginId(),
      ];
      $properties['full_club_name'] = new ProcessorProperty($definition);
    }

    return $properties;
  }

  public function addFieldValues(ItemInterface $item) {
    $entity = $item->getOriginalObject()->getValue();
    if ($entity->bundle() === 'club') {
      $title = $entity->get('title')->getString();
      $district = $entity->get('field_cl_district_name')->getString();

      $combined_value = $title . ' (' . $district . ')';
      $fields = $this->getFieldsHelper()
        ->filterForPropertyPath($item->getFields(), NULL, 'full_club_name');
      foreach ($fields as $field) {
        $field->addValue($combined_value);
      }
    }
  }
}

Объяснение аннотации

  • @SearchApiProcessor: Эта аннотация объявляет класс как процессорный плагин Search API.
  • id = "full_club_name": Внутреннее машинное имя плагина, которое должно быть уникальным.
  • label = @Translation("Full Club Name"): Метка для чтения человеком для плагина, которую можно перевести.
  • description = @Translation("Combine Title and District fields for clubs."): Предоставляет дополнительную информацию о том, что делает этот процессорный плагин.
  • stages = { "add_properties" = 0 }: Указывает, что этот плагин работает на этапе «add_properties» с весом 0.
  • locked = true: Процессор заблокирован для индекса и не может быть удален через пользовательский интерфейс администратора.
  • hidden = true: Процессор скрыт из пользовательского интерфейса администратора.

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

Объяснение методов

После определения аннотации плагина ядром вашего плагина являются реализованные вами методы. Вот основные методы, которые вам обычно понадобятся в процессорном плагине Search API, и их назначение:

getPropertyDefinitions(DatasourceInterface $datasource = NULL)

Этот метод отвечает за определение новых свойств, которые плагин будет добавлять или изменять. Он вызывается на этапе «add_properties», как указано в аннотации нашего плагина. Если вашему плагину нужно создавать новые поля для поискового индекса, именно здесь вы их определяете.

preprocessIndexItems(PreprocessIndexItemsEvent $event)

Этот метод вызывается для заполнения значений полей, которые вы определили в getPropertyDefinitions(). Если вы изменяете существующие поля или добавляете новые, вы указываете логику здесь. Он получает объект события, который содержит все элементы, которые вот-вот будут проиндексированы, позволяя вам изменять их свойства перед отправкой в поисковый индекс.

Шаг 3: Включение плагина и очистка кэша

После того как вы написали код для вашего пользовательского процессорного плагина Search API, вам нужно убедиться, что он распознается Drupal и Search API.

Если модуль еще не включен

Если ваш пользовательский модуль еще не включен, перейдите на страницу «Расширения» (/admin/modules) в интерфейсе администратора Drupal, найдите свой пользовательский модуль и включите его.

Если модуль уже включен

Если ваш пользовательский модуль, содержащий плагин, уже включен, Drupal автоматически не обнаружит новый плагин. Вам нужно будет очистить кэш, чтобы изменения вступили в силу. Вы можете очистить кэш через интерфейс администратора, перейдя в «Конфигурация» > «Разработка» > «Производительность» (/admin / config / development / performance) и нажав «Очистить весь кэш».

В качестве альтернативы вы можете очистить кэш с помощью Drush, выполнив следующую команду:

drush cr

Шаг 4: Настройка индекса Search API

После включения модуля и очистки кэша перейдите к настройкам полей вашего индекса Search API, перейдя по адресу /admin/config/search/search-api/index/your-index/fields.

  1. Нажмите кнопку «Добавить поля», обычно расположенную в верхней части страницы. Это действие отобразит список доступных полей.
  2. В этом списке вы должны найти ваше недавно добавленное пользовательское поле с меткой Full Club Name.
  3. Выберите это поле, а затем нажмите кнопку «Добавить» рядом с именем поля, чтобы включить его в ваш индекс.
  4. Нажмите «Готово».
  5. Наконец, повторно проиндексируйте ваш контент, чтобы убедиться, что новое пользовательское поле заполнено и стало доступным для поиска.
Пользовательские поля, добавленные в индекс

Использование пользовательского поля в представлениях и поиске

После включения вашего пользовательского модуля и очистки кэша ваш процессорный плагин Search API должен быть активирован. Что это значит для вас:

Доступность полей в представлениях индекса

Ваше новое пользовательское поле Full Club Name будет доступно в списке полей при создании или редактировании представления индекса в Drupal. Это дает вам возможность включить эти агрегированные данные как часть ваших результатов поиска или списков представлений.

Фильтры полнотекстового поиска

Если вы определили пользовательское поле как тип «Полнотекстовый» в настройках Search API, вы также можете использовать это поле в качестве критерия фильтрации в представлении индекса. Это позволяет пользователям выполнять полнотекстовые поисковые запросы конкретно по этому объединенному полю, потенциально улучшая точность и релевантность результатов поиска.

Заключение

Это руководство провело вас через процесс создания пользовательского процессорного плагина Search API в Drupal 8, 9 и 10. Плагин с именем FullClubName объединяет поля title и field_cl_district_name из типа контента Club в одно поле для поиска. Это расширяет ваши поисковые возможности и является отличным примером того, насколько гибким и расширяемым может быть Drupal.

Удачного отлаживания!

Категории:

Теги: