Wat is Elasticsearch?

Elasticsearch is een zoek- en analyse-engine waarmee grote hoeveelheden data snel doorzocht kunnen worden. Ik gebruik het voornamelijk wanneer reguliere database queries niet meer voldoende zijn voor complexe zoekfunctionaliteit, filtering of aggregaties.

Voor mij is Elasticsearch vooral interessant wanneer zoeken echt onderdeel is van het product. Niet als databasevervanger, maar als gespecialiseerde laag naast de primaire datastore.

Belangrijke dingen om te weten

Elasticsearch werkt fundamenteel anders dan een relationele database. Data wordt geïndexeerd zodat zoekopdrachten snel uitgevoerd kunnen worden, maar daar staat tegenover dat je vooraf goed moet nadenken over mappings, indexstructuur en synchronisatie van data.

Een paar onderwerpen waar ik altijd bewust naar kijk:

  • Mappings bepalen hoe velden worden geïndexeerd en doorzocht.

  • Analyzers bepalen hoe tekst wordt verwerkt voordat deze beschikbaar is voor zoekopdrachten.

  • Indexen moet je ontwerpen rondom het daadwerkelijke zoekgedrag van gebruikers.

  • Aggregaties maken Elasticsearch interessant voor analyses en faceted search.

  • Synchronisatie tussen Elasticsearch en de primaire databron moet expliciet worden ontworpen.

  • Performance hangt sterk samen met hoe je documenten structureert en welke queries je uitvoert.

Ik probeer Elasticsearch daarom bewust eenvoudig te houden. Een complex zoekmodel bouwen omdat het technisch mogelijk is, levert later vaak vooral onderhoud op.

Hoe ik Elasticsearch gebruik

Ik gebruik Elasticsearch voornamelijk als secundaire datastore voor zoekfunctionaliteit. De primaire waarheid blijft dan bijvoorbeeld in een relationele database of MongoDB staan, terwijl Elasticsearch een geoptimaliseerde representatie bevat voor zoeken.

Daarbij vind ik het belangrijk dat duidelijk is welke datastore verantwoordelijk is voor welke data. Elasticsearch moet niet ineens ongemerkt de bron van waarheid worden omdat het toevallig makkelijk is om er data uit te lezen.

Bij event-driven systemen ligt het voor mij voor de hand om wijzigingen vanuit het domein door te sturen naar Elasticsearch. Daarmee kun je de zoekindex los houden van de transactionele verwerking en accepteren dat de zoekresultaten uiteindelijk consistent worden.

Waar ik Elasticsearch heb gebruikt

Bij Marvia heb ik Elasticsearch gebruikt binnen een SaaS-platform voor Local Marketing Automation. Elasticsearch maakte daar onderdeel uit van een bredere architectuur met onder andere microservices, MongoDB, AWS Lambda, SES, SNS en Docker.

Binnen zo'n platform heb je te maken met grote hoeveelheden marketingcontent en informatie die gebruikers snel moeten kunnen terugvinden. Elasticsearch past daar goed omdat zoeken, filteren en het ontsluiten van data daadwerkelijk onderdeel zijn van de gebruikerservaring.

Mijn ervaring met Elasticsearch

Mijn meest relevante ervaring met Elasticsearch komt uit mijn periode bij Marvia, waar ik er meerdere jaren mee heb gewerkt binnen een productieomgeving.

Wat ik daar vooral van heb meegenomen is dat Elasticsearch technisch sterk is, maar dat je het alleen moet toevoegen wanneer het probleem daar ook daadwerkelijk om vraagt.

Het introduceren van Elasticsearch betekent namelijk ook dat je een extra datastore moet beheren, monitoren en synchroniseren. Je krijgt er krachtige zoekfunctionaliteit voor terug, maar ook extra operationele complexiteit.

Daarom kijk ik eerst naar de behoefte. Wanneer simpele database-indexen voldoende zijn, kies ik daarvoor. Wanneer zoeken complexer wordt en een belangrijk onderdeel vormt van het product, wordt Elasticsearch interessant.

Dat past ook bij hoe ik naar backend engineering kijk: niet zoveel mogelijk technologie gebruiken, maar de technologie kiezen die het probleem daadwerkelijk eenvoudiger maakt.

Veelgestelde vragen die ik krijg over Elasticsearch

Gebruik je Elasticsearch als primaire database?

Meestal niet. Ik zie Elasticsearch vooral als gespecialiseerde zoeklaag. De primaire datastore blijft verantwoordelijk voor de waarheid van het domein.

Wanneer zou je Elasticsearch toevoegen?

Wanneer zoeken belangrijk wordt voor het product en reguliere database queries te beperkt of te complex worden. Bijvoorbeeld bij full-text search, uitgebreide filtering en aggregaties.

Is Elasticsearch altijd sneller dan een database?

Nee. Voor simpele lookups kan een reguliere database met goede indexen prima of zelfs eenvoudiger zijn. Elasticsearch wordt interessant bij complexere zoekpatronen.

Hoe houd je Elasticsearch synchroon met je database?

Bij moderne architecturen doe ik dat het liefst event-driven. Een wijziging in het domein resulteert in een event waarmee de zoekindex wordt bijgewerkt. Daarmee accepteer je bewust eventual consistency tussen de primaire datastore en Elasticsearch.

Zou je Elasticsearch tegenwoordig automatisch toevoegen aan een nieuw platform?

Nee. Eerst begrijpen welk probleem er opgelost moet worden. Elasticsearch brengt veel mogelijkheden, maar ook infrastructuur, monitoring en onderhoud met zich mee. Als PostgreSQL, MongoDB of een andere primaire datastore het probleem eenvoudig kan oplossen, heeft dat mijn voorkeur.