Een snelle kijk op Solr


Wat is Solr?

Wat is Solr?

Solr is een searchengine die gebouwd is bovenop Lucene. Met Solr kan je profiteren van de voordelen van Lucene zoals zeer snel zoeken in data (tekst, pdf,...) met correcties, stopwoorden, fuzzysearches, sorteringen op relevantie en in onze cases vooral faceting.

Faceting is wat je tegenwoordig ziet bij heel wat online shops. Wanneer men filtert op categorieën, krijg je reeds op voorhand het aantal resultaten die je zal verkrijgen bij het selecteren van die bepaalde categorie.

Vroeger (voor versie 5) kon men Solr op Windows enkel gebruiken als applicatie binnen webservers als Apache Tomcat. Als Microsoft developers installeren we uiteraard niet graag tools als Apache Tomcat. Gelukkig kunnen we sinds versie 5 ook Solr installeren als een service. Door Solr te installeren als een service besparen we meteen heel wat configuratietijd. Binnen de 10 minuten is Solr up & running.

Vereisten

Om Solr te gebruiken hebben we met de huidige 5.x versie enkel nog maar de volgende software nodig:

  • Solr (v5.4.1 op het moment van schrijven)
  • NSSM (met dit stukje software kan je Solr toevoegen als service in Windows)
  • Java (versie 7 of hoger)

Installatie

Installatie

We starten met Solr te downloaden en de inhoud van de zip file te extracten in een map naar keuze, bv D:\Testprojects\Solr\solr-5.4.1.
Vervolgens doen we hetzelfde met Nssm en plaatsen dit op D:\Testprojects\Solr\nssm-2.24.
Installeer uiteindelijk ook Java.

Via Nssm kan Solr worden geïnstalleerd als een service in Windows. Dit kan eenvoudigweg door in de command line het volgende in te geven:
D:\Testprojects\Solr\nssm-2.24\win64\\nssm.exe install Solr5

Vervolgens wordt Nsss gestart en kies je Solr.cmd uit de Solr bin-directory als servicepath.
Als argument geef je mee: "start -f -p 8080" waarbij 8080 voor het poortnummer staat die je uiteraard zelf kan kiezen.
Na het bevestigen is Solr geïnstalleerd als service in Windows. Deze service kan nu gestart worden.

Indien de service nog niet kan gestart worden, staat er waarschijnlijk nog geen omgevingsvariabele JAVA_HOME geconfigureerd in Windows. Hier zie je hoe dit moet.

Surf nu naar http://localhost:8080 en je krijgt het dashboard van Solr te zien.

Solr Core

Solr Core

De Solr installatie werd nu voltooid, maar moet nog configureerd worden d.m.v. ten minste één core toe te voegen.

Een core is een losstaande configuratie die een Lucene index bevat. Je kan dit het best vergelijken met een tabel uit een database. Meerdere cores staan los van elkaar en hebben dan ook geen relaties zoals een klassieke database.

In oudere versies van Solr kon er maar 1 core worden gebruikt per Solr installatie. Sedert versie 3.4 is er ondersteuning voor meerdere cores in één Solr instantie.

In het dashboard kunnen cores worden aangemaakt via het menu-item "Core Admin".
Noteer hier een logische naam voor de Core. In ons voorbeeld gaan we nummerplaten indexeren om hier later queries op te maken. We noemen onze core dan ook "PlateReads" en zorgen er voor dat de instancedirectory dezelfde naam krijgt.

Indien Solr bij het aanmaken een foutbericht geeft omtrent ontbrekende bestanden, kopieer dan deze bestanden uit een demofolder die eveneens in de zipfile van Solr aanwezig is, bv in server\solr\configsets\basic_configs\conf.

Schema

De scheme.xml file is terug te vinden in de instance directory van de core. In dit voorbeeld staat de file in de map D:\Testprojects\Solr\solr-5.4.1\server\solr\PlateReads. *

De velden staan in de tag <fields> en kunnen vrij worden uitgebreid. Velden kunnen multivalued zijn, hierdoor kunnen er meerdere waarden in een veld komen, wat in veel gevallen zeer handig kan zijn (bv een product in meerdere kleuren, al kan je dit eventueel ook aanzien als meerdere producten).

Om onze fictieve reads van nummerplaten te bewaren worden onderstaande velden voorzien in het schema:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="Plate" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="Date" type="date" indexed="true" stored="true" required="true" multiValued="false" />
<field name="City" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="Brand" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="Color" type="string" indexed="true" stored="true" required="true" multiValued="false" />

We zullen dus wagens fictief scannen en bewaren in Solr met een id, nummerplaat, datum, gemeente, merk & kleur. Merk op dat alles in Solr HoOfDlEtTeRgEvOeLiG is.

Nadat de file bewaard wordt, klikken we in de Core Admin op de reloadknop, zodat Solr de nieuwe configuratie kan inlezen. Als alternatief kan je ook de service herstarten.

* Opmerking (14/04/2017): In Solr versie 6+ bestaat de scheme.xml file niet meer, maar heet deze file nu "managed-schema". Je kan deze file manueel aanpassen, maar ook via de webinterface van Solr.

Gebruik

Solr wordt geconsumeerd over http.

Data toevoegen kan door data te posten naar een url binnen de core. Data updaten kan niet, hiervoor moet men data verwijderen en opnieuw toevoegen.

Data uitlezen gebeurt door een query via GET parameters mee te sturen naar Solr. Vervolgens krijgt men de resulaten in xml of json terug.

Er bestaat voor .Net een library die SolrNet heet. Met deze library kan data op een eenvoudige manier aan een klasse gemapped worden die vervolgens de communicatie met de SolrCore op zich neemt. Queries kunnen met deze library ook meer objectmatig worden opgebouwd en uitgevoerd. Naar eigen ervaring & voorkeuren toe gebruik ik SolrNet enkel om data toe te voegen aan Solr en zorg ik manueel voor de (soms complexere) queries.

Queries die json teruggeven kan je meteen doorgeven aan de frontend van de applicatie en kunnen door o.a. Angular meteen worden geparsed.

Data toevoegen aan Solr

Data toevoegen aan Solr

Data toevoegen in Solr doe je het eenvoudigst met Solrnet, een package die beschikbaar is in Nuget.

Om aan te tonen hoe snel Solr data kan doorzoeken hebben we in en console app 5 miljoen records gegenereerd. Zowel het indexeren als het querieën op deze data gaat bijzonder snel. De console app kan hier worden gedownload.

Wanneer gebruikt gemaakt wordt van SolrNet moet Solr geïnitialiseerd worden bij het opstarten van de applicatie:
Startup.Init<Read>("http://localhost:8080/solr/PlateReads");
Bij een webapplicatie is het aangeraden om bovenstaande code in de App_Start van Global.asax te zetten.

Nadien moet het importeren uiteraard nog gebeuren. Dit gebeurt in 2 stappen (Zie afbeelding)

  1. Objecten aanmaken en één voor één toevoegen aan Solr
  2. Eénmalig commit uitvoeren. Dit zorgt voor het starten van het indexeringsproces in Solr

Queries op Solr

Queries op Solr

Wanneer de data in Solr aanwezig is, is het tijd om queries te maken hierop. Deze queries gebeuren door GET requests sturen naar Solr. De request sturen een response door in een formaat naar keuze, waaronder json, xml, csv,...

De eenvoudigste manier om hierop queries te maken is via de Solr interface, te vinden via het menu "Query". Hiervoor selecteer je in de dropdown eerst de juiste core.

Een eenvoudige query op deze 5 miljoen records duurt initieel amper +- 300ms. Queries nadien gebruiken cache waar mogelijk, waardoor een volgende pagina inladen in mijn test amper 80ms duurt en dezelfde queries zelf 0ms. Let op: Dit zijn querytijden op liefst 5.000.000 records. Via een gewone relationele database kan je nooit dergelijke tijden behalen. Wanneer je veel minder data hebt (pakweg 100.000 records), dan is de volledige execution time te verwaarlozen.

Belangrijkste parameters in de queries:

  • fq (filterquery): wordt gebruikt voor het filteren op velden
  • sort: sorteren op een veld (veldnaam [asc|desc]
  • start: startindex (vergelijkbaar met skip)
  • rows: aantal records die je wil verkrijgen (vergelijkbaar met take)
  • fl (fieldlist): opsomming van de velden die je wenst te selecteren (indien leeg, dan krijg je alle velden)
  • wt: dit is het outputtype (json, xml, csv,...)
  • facet: dit dient om naast de resultaten zelf, ook aantallen te verkrijgen per categorie van het aantal resultaten (hiervoor gebruiken we bij Progressive vooral Solr). Dit wordt gebruikt in combinatie met facet.field en optioneel enkele andere parameters.

Verdere uitleg ivm parameters is voldoende online te vinden.

Conclusie

Solr is een zeer krachtige tool om o.a.

  • heel veel data te doorzoeken
  • zoeken en sorteren op relevantie
  • facets
  • kan pdf, excel, word files indexeren en doorzoeken
  • spatial queries (coördinaten & afstandsberekeningen)
  • woordcorrectie: spellingsfouten opvangen

Solr is geen vervanger van een relationele database.
Zorg er daarom voor dat alle data toch in een gewone database terecht komt om verdere bewerkingen op te doen. Gebruik Solr om de data te doorzoeken.