Zurück zum Blog

Erstellen eines Solr-kompatiblen Search API Processor Plugins in Drupal 10

2023-08-296 Minuten Lesezeit

In Drupal ist die Integration mit Solr für leistungsstarke Suchfunktionen üblich. Manchmal müssen Sie Informationen aus mehreren Feldern kombinieren, um ein neues benutzerdefiniertes Feld für die Solr-Suche zu erstellen. Dieser Leitfaden zeigt Ihnen, wie Sie ein Solr-kompatibles Search API Processor Plugin in Drupal 10 erstellen. Dieser Leitfaden ist auch mit Drupal 8 und 9 kompatibel.

Voraussetzungen

  1. Eine funktionierende Drupal 8-, 9- oder 10-Installation
  2. Solr Suchmaschine mit Drupal integriert
  3. Ein benutzerdefinierter Inhaltstyp namens Club mit einem benutzerdefinierten Feld field_cl_district_name. (Hinweis: Das Feld title ist eine Standardeigenschaft für jeden Drupal-Inhaltstyp. Für diesen Artikel wird dem Inhaltstyp ein benutzerdefiniertes Feld für den Bezirksnamen hinzugefügt. Sie sollten einen für Ihr Projekt relevanten Inhaltstyp erstellen oder verwenden.)
  4. Das Modul Drupal Search API installiert und aktiviert
  5. Das Modul Search API Solr installiert und aktiviert
  6. Benutzerdefiniertes Modul namens my_custom_module (Sie können es beliebig benennen)

Solr-Kompatibilität

Dieser Leitfaden ist mit Solr kompatibel, einem der beliebtesten Such-Backends, die mit Drupal verwendet werden. Das benutzerdefinierte Search API Processor Plugin, das Sie erstellen werden, kann so konfiguriert werden, dass es nahtlos mit Solr funktioniert und die Suchfunktionen Ihrer Website verbessert.

Erstellen des Search API Processor Plugins

Schritt 1: Vorbereiten Ihres benutzerdefinierten Moduls

Wenn Sie noch kein benutzerdefiniertes Modul erstellt haben, müssen Sie es zuerst einrichten. Erstellen Sie einen Ordner unter modules/custom mit dem Namen my_custom_module. Darin benötigen Sie eine Datei my_custom_module.info.yml mit folgendem Inhalt:

name: 'Mein benutzerdefiniertes Modul'
type: module
description: 'Ein benutzerdefiniertes Modul zur Erweiterung von Drupal-Funktionalitäten.'
core_version_requirement: ^8 || ^9 || ^10
package: Custom

Schritt 2: Erstellen der Plugin-Klasse

Erstellen Sie eine PHP-Datei namens FullClubName.php unter modules / custom / my_custom_module / src / Plugin / search_api / processor.

So würde die Datei FullClubName.php aussehen:

<?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("Vollständiger Clubname"),
 *   description = @Translation("Kombiniert Titel- und Bezirksfelder für 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('Vollständiger Clubname'),
        'description' => $this->t('Kombiniert die Felder Titel und Bezirk für 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);
      }
    }
  }
}

Annotation erklärt

  • @SearchApiProcessor: Diese Annotation deklariert die Klasse als Search API Processor Plugin.
  • id = "full_club_name": Der interne Maschinenname für das Plugin, der eindeutig sein muss.
  • label = @Translation("Vollständiger Clubname"): Die für Menschen lesbare Bezeichnung für das Plugin, die übersetzt werden kann.
  • description = @Translation("Kombiniert Titel- und Bezirksfelder für Clubs."): Bietet weitere Informationen darüber, was dieses Processor-Plugin tut.
  • stages = { "add_properties" = 0 }: Gibt an, dass dieses Plugin in der Phase "add_properties" mit einer Gewichtung von 0 operiert.
  • locked = true: Das Plugin ist an den Index gebunden und kann nicht über die Admin-Oberfläche entfernt werden.
  • hidden = true: Das Plugin ist in der Admin-Oberfläche ausgeblendet.

Diese Annotation ist unerlässlich, da sie definiert, wie Drupal die folgende Klasse behandeln soll. Sie gibt alles an, vom Plugin-ID und -Label bis hin zu nuancierterem Verhalten wie den Phasen, an denen es teilnimmt, und ob es in der Benutzeroberfläche gesperrt oder ausgeblendet ist.

Methoden erklärt

Nachdem die Plugin-Annotation definiert wurde, liegt der Kern Ihres Plugins in den implementierten Methoden. Hier sind die wesentlichen Methoden, die Sie typischerweise in einem Search API Processor Plugin benötigen, und was jede einzelne tut:

getPropertyDefinitions(DatasourceInterface $datasource = NULL)

Diese Methode ist dafür verantwortlich, neue Eigenschaften zu definieren, die das Plugin hinzufügen oder manipulieren wird. Sie wird während der in unserer Plugin-Annotation angegebenen Phase "add_properties" aufgerufen. Wenn Ihr Plugin neue Felder für den Suchindex erstellen muss, definieren Sie diese hier.

preprocessIndexItems(PreprocessIndexItemsEvent $event)

Diese Methode wird aufgerufen, um die Werte der in getPropertyDefinitions() definierten Felder zu befüllen. Wenn Sie vorhandene Felder manipulieren oder neue hinzufügen, legen Sie hier die Logik fest. Sie empfängt ein Event-Objekt, das alle Elemente enthält, die gerade indiziert werden, und ermöglicht es Ihnen, deren Eigenschaften zu ändern, bevor sie an den Suchindex gesendet werden.

Schritt 3: Aktivieren des Plugins und Leeren des Caches

Nachdem Sie den Code für Ihr benutzerdefiniertes Search API Processor Plugin geschrieben haben, müssen Sie sicherstellen, dass er von Drupal und der Search API erkannt wird.

Wenn das Modul noch nicht aktiviert ist

Wenn Ihr benutzerdefiniertes Modul noch nicht aktiviert ist, navigieren Sie zur Seite Erweitern (/admin/modules) in Ihrer Drupal-Admin-Oberfläche, suchen Sie Ihr benutzerdefiniertes Modul und aktivieren Sie es.

Wenn das Modul bereits aktiviert ist

Wenn Ihr benutzerdefiniertes Modul, das das Plugin enthält, bereits aktiviert ist, erkennt Drupal das neue Plugin nicht automatisch. Sie müssen den Cache leeren, damit die Änderungen wirksam werden. Sie können den Cache über die Admin-Oberfläche leeren, indem Sie zu Konfiguration > Entwicklung > Leistung (/admin / config / development / performance) navigieren und auf "Alle Caches löschen" klicken.

Alternativ können Sie den Cache mit Drush mit dem folgenden Befehl leeren:

drush cr

Schritt 4: Konfigurieren des Search API Index

Nachdem Sie das Modul aktiviert und den Cache geleert haben, navigieren Sie zu den Feldeinstellungen Ihres Search API Index, indem Sie zu /admin/config/search/search-api/index/your-index/fields gehen.

  1. Klicken Sie auf die Schaltfläche "Felder hinzufügen", die sich normalerweise oben auf der Seite befindet. Diese Aktion zeigt eine Liste der verfügbaren Felder an.
  2. In dieser Liste sollten Sie Ihr neu hinzugefügtes benutzerdefiniertes Feld mit dem Namen Vollständiger Clubname finden.
  3. Wählen Sie dieses Feld aus und klicken Sie dann auf die Schaltfläche "Hinzufügen" neben dem Feldnamen, um es in Ihren Index aufzunehmen.
  4. Klicken Sie auf Fertig.
  5. Indizieren Sie schließlich Ihre Inhalte neu, um sicherzustellen, dass das neue benutzerdefinierte Feld gefüllt wird und durchsuchbar ist.
Benutzerdefinierte Felder zum Index hinzugefügt

Verwenden des benutzerdefinierten Feldes in Views und Suche

Sobald Sie Ihr benutzerdefiniertes Modul aktiviert und den Cache geleert haben, sollte Ihr benutzerdefiniertes Search API Processor Plugin aktiviert sein. Was das für Sie bedeutet:

Verfügbarkeit von Index-View-Feldern

Ihr neues benutzerdefiniertes Feld Vollständiger Clubname ist in der Liste der Felder verfügbar, wenn Sie eine Index-Ansicht in Drupal erstellen oder bearbeiten. Dies gibt Ihnen die Möglichkeit, diese aggregierten Daten als Teil Ihrer Suchergebnisse oder Ansichtslisten einzubeziehen.

Volltext-Suchfilter

Wenn Sie das benutzerdefinierte Feld in Ihren Search API-Einstellungen als "Volltext"-Typ definiert haben, können Sie dieses Feld auch als Filterkriterium innerhalb der Index-Ansicht verwenden. Dies ermöglicht es Benutzern, Volltext-Suchanfragen speziell für dieses kombinierte Feld durchzuführen, was potenziell die Genauigkeit und Relevanz der Suchergebnisse verbessert.

Fazit

Dieser Leitfaden hat Sie durch den Prozess der Erstellung eines benutzerdefinierten Search API Processor Plugins in Drupal 8, 9 und 10 geführt. Das Plugin mit dem Namen FullClubName kombiniert die Felder title und field_cl_district_name aus dem Inhaltstyp Club zu einem einzigen durchsuchbaren Feld. Dies verbessert Ihre Suchfunktionen und ist ein perfektes Beispiel dafür, wie flexibel und erweiterbar Drupal sein kann.

Viel Spaß beim Debuggen!

Kategorien: