Drupal 8 en Solr: Google-snel zoeken binnen je eigen website | Waarom en hoe

06 Dec 2016

Joris Snoek - Business Dev
+31 (0)20 - 261 14 99

Drupal website snelheid is belangrijk, zeer belangrijk. Voor zowel bezoekers als zoekmachines een essentieel criteria voor succes. Maar hoe houd je je website snel, zelfs als het 1.000.000-en pagina's en documenten bevat?

Momenteel zijn we bezig met migratie van een Drupal 7 website naar een Drupal 8 systeem, waarin 1.000.000-en pagina’s en documenten staan. Het is de bedoeling dat eindgebruikers voornamelijk navigeren via de zoekfunctie. Wat dus betekent dat deze razendsnel moet zijn.

Drupal 8 bevat standaard een prima zoekfunctie, maar omdat deze standaard zoekt in een MySQL database wordt de zoekfunctie helaas te traag wanneer de website erg veel pagina’s en documenten bevat.

Snelle search binnen Drupal 8 met Solr 6

Even voor de duidelijkheid: wanneer je een Drupal 8 website hebt met erg veel content dan zal het systeem prima snel blijven als je navigeert middels klikken op (menu) links. Het gaat in dit geval om de zoekfunctie en het snel op het scherm krijgen van relevante zoekresultaten.

Zoekmachine Apache Solr is al jarenlang Drupal’s vriend hierin. Een implementatie van Solr zorgt voor een snelle zoekfunctie binnen je website (of social intranet). En biedt extra functies als:

  • Fuzzy search: spellingsfouten en afwijkingen mogelijk
  • Facetted search: zoekfilters, soortgelijk aan Marktplaats.nl en Funda.nl.
  • Rich text-snippets: een stukje tekst waarin het woord gevonden zoals Google ook geeft. Als je schema.org geïmplementeerd hebt, dan zal gevonden data automatisch ‘rich’ gepresenteerd worden. Very nice!
  • ‘Bedoelde je…’ functie: suggesties voor synoniemen, of keywords die dichtbij de zoekopdracht liggen.
  • Configureren wat meest relevant is bij een zoekopdracht, zodat de bezoeker meest relevante resultaat bovenaan te zien krijgt. Voorbeelden waarop je kunt ordenen: content type, sticky, datum, title, reacties, headings (h1->h6), body tekst.

Voornamelijk de fuzzy search is zeer welkom; Solr is echt een prachtmachine en onvoorstelbaar snel: miljoenen documenten zijn geen probleem. Uiteraard zal je wel je server capaciteit hierop moeten afstemmen.

Implementatie Solr in Drupal 7 versus Drupal 8

Solr in Drupal 7 is relatief eenvoudig te implementeren, omdat deze al jaren in ontwikkeling is: vele stabiele modules zijn vrijgegeven om allerlei user stories te realiseren.

In Drupal 8 is de integratie momenteel ook al een flink eind, maar nog niet plug-and-play als in Drupal 7. Ook is de opzet van architectuur gewijzigd: in Drupal 7 had je twee belangrijke Solr modules Apache Solr Search en Search API Solr, beide hebben een eigen ecosysteem aan modules.

In Drupal 8 hebben zij krachten gebundeld, waardoor ontwikkeling beter is en extra modules niet meer hoeven te kiezen op welk ecosysteem ze gaan bouwen. Modules als Facet API (nu Facets), Facet API Pretty Paths, Search API Autocomplete, etc.) kunnen nu focussen op één implementatie in plaats van twee (bron).

Implementatie van Solr in Drupal 8

As we speak is de Drupal 8 Solr module in beta1, wat in dit geval inhoudt dat hij stabiel genoeg blijkt om in te zetten maar nog niet plug-and-play werkt.

Hierbij een toelichting hoe wij hem werkend kregen:

De Solr server

We hebben een nieuwe VPS opgezet, waarin Solr geïnstalleerd is. Deze draait niet op de live server van de website, omdat betreffende hoster het niet ondersteunde.

Daarnaast is Solr beter beheerbaar en beter te beveiligen op een dedicated, geïsoleerde server. Middels het openzetten van de juiste porten kan er een verbinding gemaakt worden tussen de publiekelijke server van de Drupal 8 website en de Solr server.

Alle overige poorten worden dicht gezet door de firewall, verder zijn er geen grafische interfaces nodig, alleen een SSH toegang welke beveiligd is met keys.

De capaciteit van de Solr server is te berekenen, zie hier

Installeren en configureren Drupal Solr module

Volgende modules moeten geïnstalleerd worden:

  • Search (core)
  • Search Api - contrib module
  • Search Api Solr - contrib module
  • Composer manager - contrib module, wordt gebruikt voor beheren van externe libraries, in dit geval zullen we de lib Solarium gaan installeren.

Optioneel

  • Search Autocomplete - contrib module, deze gebruiken we om een de zoekbox in het frontend voor de eindgebruiker ook via Solr te laten zoeken. Waardoor bijvoorbeeld fuzzy search en instant search suggesties relatief makkelijk worden. Deze werkt momenteel nog niet out-of-the-box, vandaar dat we hier custom code voor hebben geschreven (zie verderop in dit blog).

Installatie en configuratie Drupal 8 connectie met Solr

Ik ga in dit blog niet in op de installatie van Solr zelf, instructies hiervoor kan je hier vinden.

1. Installatie ‘Solarium’ library

Als je bovenstaande modules hebt geïnstalleerd, ga dan als eerste naar Reports -> Composer manager. Daar zie je de code staan die je in je terminal moet invoeren om ‘Solarium’ te installeren.

drupal solr composer update

Zodra je ‘composer drupal-update’ doorlopen hebt, staat Solr initieel gereed in Drupalrootmap/vendor/solarium:

drupal solr install ready

FYI: de map ‘Vendor’ staat waarschijnlijk in je GIT ignore file

2. Solr ‘server’ toevoegen in Drupal 8

  • Ga naar Settings -> Zoeken en metadata -> Search API.
  • Klik op Add server en configureer de Solr server, een voorbeeld van een lokale installatie:

solr configuratie drupal8

Belangrijkste instellingen:

  • Solr versie (wij gebruiken versie 6)
  • Port
  • Host

Klik op ‘Opslaan’ -> Nu heeft je Drupal 8 systeem een Solr server connectie, maar die doet verder nog niks.

3. ‘Index’ toevoegen

Om daadwerkelijk Drupal content geïndexeerd te krijgen in Solr zul je een ‘index’ moeten aanmaken.
Ga naar Settings -> Zoeken en metadata -> Search API. Klik op ‘Add index’

drupal solr add index

Nadat je een index hebt aangemaakt, open hem en klik op tab ‘Fields’, vervolgens ‘Add Fields’

drupal solr add fields

Nu kan je de index configureren:

Drupal 8 solr index config

Deze invoerinterface is nogal omslachtig, waarschijnlijk omdat de Drupal Solr module nog in beta1 is momenteel. Je kunt bijvoorbeeld niet zien welke velden je al hebt toegevoegd aan de index, let dus op dat je velden niet meerdere keren toevoegt.

Even een handmatig klusje, maar prima te doen.

De toegevoegde Fields kan je zien onder de tab ‘Fields’:

Drupal 8 Solr fields config

4. Configureer ‘Processors’

Klik op de tab ‘Processors’, hier kan je aangeven met welke condities de Solr search wordt uitgevoerd:

Solr Drupal 8 configuratie processors

5. Indexeren maar

Jouw Drupal content zou nu bij een Cron run geïndexeerd moeten worden in Solr, je kunt deze ook handmatig starten. De status kan je terugzien:

6. Frontend: zoekopdrachten -en resultaten voor eindgebruikers

Dit is waar het uiteindelijk allemaal om draait, zoekresultaten voor de Drupal website bezoeker:

  • Razend snel
  • Meest relevante resultaten bovenaan
  • Spellingsfouten geen probleem

Denk: Google voor je eigen website ;)

De modules die de hiervoor beschikbaar zijn werken (nog) niet goed genoeg voor onze implementatie. Met Views bleek het ook nog niet te lukken, je kunt wel een ‘index View’ configureren, maar die gaf geen resultaten.

Custom code bleek voor ons momenteel de beste optie, tevens om de globale ’Search autocomplete box’ werkend te krijgen.

Check hier de code op Github

Toelichting enkele code snippets

Voor uitleg: zie code comments, hierbij enkele code snippets toegelicht:

De hook_page_attachments_alter is om de bug op te lossen uit Input field value is not sent with the AJAX request when using URL callback with custom view and exposed filter. De search autocomplete is alleen in staat om contextual filters te gebruiken. Met deze hook kan je een eigen filter gebruiken (of een default in stellen).

De LuciusSolrController is opgedeeld in:

__construct voor het aanmaken, hier staat nog een @todo in.

$config = \Drupal::config('search_api.server.solr');

Dit mag eigenlijk niet en zou als service mee moeten komen. (vanwege dependency injection, welke voor dit onderdeel dus ontbreekt).

create

Hier worden de verschillende services toegevoegd (geïnjecteerd in de container).

search

Hier bouwen we de custom search op, deze functie heeft een tweede argument $processing_callback welke gebruikt zou moeten worden voor de autocomplete variant, welke dus nog aangepast moet worden.

lucius_solr_autocomplete_doc_processing

Dit is voor de opbouw van de autocomplete resultaten.

lucius_solr_autocomplete

Deze zou search moeten aanroepen met de lucius_solr_autocomplete_doc_processing callback.

getSolrConnector

Functie voor het ophalen van de solrConnector.

prepare_solr_query

Functie welke de query fuzzy maakt en opschoont middels een xss filter. Hier moeten waarschijnlijk nog wat andere dingen gedaan worden voor contains etc maar voor nu is fuzzy voldoende.(Mogelijk moet contains in de search)

Beta

Deze module is bij ons ook nog in beta, wat betekent dat hij nog uitvoerig getest moet worden, op snelheid, veiligheid, stabiliteit en documentatie.

Ik kan me voorstellen dat je hier vragen over hebt, let us know.

Search resultaten voor bezoekers - screenshots

De aangegeven Drupal 8 installatie bevat privé data, daar kunnen we geen screenshots van maken. In plaats daarvan, screenshots van een soortgelijke Solr implementatie in OpenLucius: een work management system -open source vrijgegeven als Drupal distributie.

Auto complete zoekbox

Zoekresultaten, die ook teksten ín document zelf vindt (doc, xls, pdf, zip, etc).

FYI: Data collecties in Solr

In Solr kan je data collecties aanmaken, als je meerdere websites of externe data bronnen wilt indexeren en zoekbaar maken, dan is het goed om dat in verschillende data collecties te doen. Afhankelijk van je Solr versie wordt dit ook wel genoemd:

  • Core (Solr v4)
  • Shard/collectie (Solr v5)
  • Collection (Solr v6)

Samenvattend

Bevat je Drupal website erg veel content en documenten? Solr helpt big time. In Drupal 7 is deze integratie al flink ontwikkeld en relatief makkelijk: geen custom code nodig.

In Drupal 8 is deze implementatie inmiddels ook in beta1, custom code is nog wel benodigd om de resultaten goed naar wens te krijgen op het scherm van de Drupal website bezoeker. Het zal me niet verbazen als binnen enkele maanden er geen custom code meer nodig is, omdat er constant hard gewerkt wordt door de Drupal community aan de Solr modules.

Header image credit

Comments

Nóg meer
kennis nodig?

Check ons ons blog archief >