Menu

Een verbeterde WordPress zoekfunctionaliteit met Elasticsearch

Karel-Jan 15 oktober 2018

WordPress is uitgerust met een zoekfunctie. Deze zoekfunctionaliteit werkt voor veel websites prima. Het doet wat het moet doen. Je zoekt op een bepaald zoekwoord en WordPress genereert een lijst met berichten en/of pagina’s waarbij het zoekwoord in de titel of inhoud voorkomt. De zoekresultaten worden gesorteerd op datum.

In de blog ‘De WordPress zoekfunctie – Hoe werkt het?‘ kan je meer lezen over de werking hiervan. Bevat je website een grote hoeveelheid data, dan loop je echter gauw tegen problemen aan. In deze blog geef ik een aantal handvaten voor het verbeteren van de WordPress zoekfunctie.

Relevante zoekresultaten

Bij een zoekopdracht in een WordPress website resulteert dat niet altijd in relevante resultaten. De resultaten worden gesorteerd op datum en niet op bijvoorbeeld hoe vaak een zoekwoord voorkomt. Gelukkig zijn er plugins die dit probleem oplossen. Relevanssi en SearchWP zijn het meest populair. Beide plugins maken sortering op basis van relevantie mogelijk. Ook geven de plugins de mogelijkheid om te zoeken in reacties, tags, categorieën en metavelden.

Voor sites met niet al te veel traffic is dit een prima aanvulling op de standaard zoekfunctionaliteit. Deze plugins lossen echter de performance problemen niet op. De WordPress zoekfunctie voert een query uit op de database die er ongeveer zo uitziet:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND (((wp_posts.post_title LIKE '%a%')
OR (wp_posts.post_excerpt LIKE '%a%')
OR (wp_posts.post_content LIKE '%a%'))) 
AND wp_posts.post_type IN ('post', 'page', 'attachment', 'story')
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'acf-disabled'
OR wp_posts.post_status = 'private') 
ORDER BY wp_posts.post_title LIKE '%a%' DESC, wp_posts.post_date DESC
LIMIT 0, 10

Er gebeurt heel wat in deze query. Je kan je voorstellen dat bij een website met veel data dit een erg trage query is. Deze query kan al gauw meerdere seconden duren. Bij sites met veel traffic is dat logischerwijs een no-go.

Elasticsearch

De oplossing is Elasticsearch. ElasticSearch is een open source product van Elastic en maakt het mogelijk om snel door grote hoeveelheden data te zoeken en analyseren. Elasticsearch indexeert data op een manier waardoor het razendsnel doorzoekbaar is. Elasticsearch kan op een eigen server draaien maar je kunt er ook voor kiezen om gebruik te maken van een cloud oplossing.

Amazon biedt bijvoorbeeld een betaalbare en schaalbare Elasticsearch cloud dienst aan. De configuratie is een fluitje van een cent. Je betaald zo’n 100 euro per maand, maar dan heb je wel een razendsnel en in potentie geavanceerd zoeksysteem. Ik noem hier bewust ‘in potentie’ omdat je zelf als ontwikkelaar nog wel verantwoordelijk bent voor de wijze waarop er omgegaan wordt met zoekwoorden.

Met ElasticPress koppel je de Elasticsearch server aan WordPress. ElasticPress is een plugin van 10up en neemt veel werk uit handen.

ElasticPress haakt in op het WP_Query object en haalt de data uit de Elasticsearch server in plaats van de WordPress MySQL database. Na plugin activatie werkt de zoekfunctie daardoor direct via Elasticsearch. De plugin biedt voldoende filters en hooks om de werking van de zoekfunctionaliteit aan te passen.

Ook interesse in een razendsnelle zoekfunctie binnen WordPress? Neem contact met ons op.

Altijd op de hoogte blijven?