- Webbprojekt 1 Elastisk sökning med Elastic Search Deltagare: Erik Lundgren, Mikael Philipsson, Johan Veeborn, Filip Åstrand Handledare: Emil Carlsson Linneuniversitetet 2013-03-27
II. Sammanfattning Hur optimerar man sökningar i databaser bestående av en stor mängd dokument? Finns det möjlighet att göra detta på ett smidigt och dynamiskt sätt? Dessa frågor och många andra utmaningar ställdes vi inför när vi tog oss an detta projekt. Vår kund, Meridium, villa ha hjälp med en förbättrad sökfunktion till deras projekt, imagevault. Till vår hjälp tog vi indexeringsverktyget Elastic Search samt en.net klient vid namn NEST. sid 2
III. Förord Uppgivna miner, upprörda känslor, ett projekt som stod och stampade och ett resultat som förvånade oss alla. Så kan vi nog sammanfatta våra tio veckor tillsammans. Långa skypesamtal, en desperat resa till Meridium, hopp och förtvivlan är alla ingredienser som färgat vår vardag denna ovanligt kalla senvinter. Ett projekt som inte liknat något vi mött under utbildningen resulterade dock i nya kunskaper och insikter kring databashantering och sökning. Låt oss beskriva ett projekt som mötte dagen, hamnade i en storm och kom ut på andra sidan starkare än någonsin. sid 3
Innehållsförteckning I. Försättsblad... sid 1 II. Sammanfattning... sid 2 III. Förord... sid 3 IV. Inledning/bakgrund... sid 5 V. Syfte och mål... sid 5 VI. Projektorganisation... sid 5 VII. Genomförande: metodik, teknik, förfarande... sid 6 VIII. Resultatbeskrivning/måluppfyllelse... sid 9 IX. Avvikelser/efterkalkyl... sid 9 X. Slutsats - varför blev det så här?... sid 10 XI. Förslag på vidareutveckling... sid 11 XII. Litteraturförslag/dokumentationshänvisning... sid 11 sid 4
IV. Inledning/bakgrund Företaget Meridium är ett webblösningsföretag vackert beläget på Svensknabben i Kalmar. Företaget har främst inriktat sig på att skapa stabila portaler åt offentliga institutioner, till exempel kommuner. De har dock vissa projekt som faller utanför denna ram. Ett sådant projekt är imagevault. Imagevault fungerar som ett valv där du kan samla viktiga media och dokument som du senare kan använda dig av på andra webbplatser. Det är här vi kommer in i bilden. Imagevault är ett projekt under utveckling som saknar en del önskvärda funktioner. Meridium hade en lista på sådana funktioner som de ville ha hjälp med och vi fastnade för deras önskan om en förbättrad sökfunktion. Vi har alla goda kunskaper inom.net världen och var alla optimistiska inför vår övning. V. Syfte och mål Syftet med uppgiften var att implementera en sökfunktion för sökning av dokument i Imagevault. Sökningen skulle presentera ett resultat med facetter som beskrev antal träffar i olika kategorier. Man skulle därefter kunna genomföra en förfinad sökning genom att exempelvis bara söka i vissa av dessa kategorier. Även mer avancerade sökfunktioner som möjligheten att använda AND och OR var efterfrågade. Detta innebar alltså att man skulle ges möjlighet att filtrera sin sökning. Som ett exempel på detta ges följande scenario: "Användaren vill kunna söka efter bilder som går att ladda ner (har status CanBeDownLoaded satt till true)". Även möjligheten att söka efter av användaren definierad metadata skulle implementeras. Eftersom en sökning med hjälp av relationsdatabas hade prövats och tagit för lång tid ville de att vi skulle använda oss av indexering och via det skapade indexet göra en sökning på detta. Vidare önskemål var att lösningen skulle vara så generell att man kunde implementera valfri sökmotor mot den. VI. Projektorganisation Gruppen består av fyra medlemmar med liknande kompetens inom.net-världen och databashantering. Initialt gjorde vi en uppdelning av projektledarrollen samt att Filip utsågs till ansvarig för kundkontakt. Vi hade veckovis handledning på tisdagar där Emil Carlsson fanns till förfogande och bistod med erfarenhet och kloka ord. På Meridium fanns Johan Magnusson och Dan Händevik att tillgå som support. Vi hade under projektets gång god och regelbunden kontakt och även en del möten via länk. Erik och Mikael besökte även Meridium på plats för ett mer närvarande möte. sid 5
Allt eftersom projektet fortgick utkristalliserades gruppens roller. Där Filip mer tog på sig rollen som dokumenterare och testare vilket gjorde att vi övriga i gruppen kunde fokusera mer på implementeringen. VII. Genomförande: metodik, teknik Eftersom vårt projekt innehöll för oss helt okända bitar var vår startsträcka lång. När vi blev bemötta av problemet hade vi svårt att över huvud taget förstå det. Vi hade tänkt oss att vår uppgift bestod av att förbättra deras sökfiltrering mot databasen vilket vi hade erfarenhet av. När uppgiften så småningom klarnade och vi förstod problematiken hade en stor del av projekttiden fortlöpt. Teknik Uppgiften bestod i att integrera ett plugin i imagevaults system. Detta plugin skulle fungera som en mellanhand mellan Meridiums Core-bibliotek och den implementerade sökmotorn. Pluginets uppgift blir alltså att indexera dokument från databasen till ett index och skapa ett interface, vilket man senare skulle kunna köra avancerade sökningar mot. På så sätt ökar man upp hastigheten och kan ta del av de funktioner som finns färdiga i sökmotorn. Vårt första steg blev alltså att undersöka hur Meridiums klassbibliotek är uppbyggt och framför allt hur deras dokumentobjekt, kallat MediaItem, ser ut. Meridiums klassbibliotek Vi lade vårt fokus på klassen MediaItem eftersom det var denna som skulle indexeras. MediaItem bestod av ett rikt utbud av egenskaper och metoder. För vår del gällde det främst att förstå strukturen på objektet och om det är möjligt för oss att skapa en sökning som täcker upp klassens alla möjligheter. Varje instans av objektet kan innehålla flera kategorier. En bild kan, som vi alla vet, säga mer än tusen ord, något som passar bra in på Meridiums MediaItemklass. Ett MediaItemobjekt kan alltså innehålla flera kategorier vilket gav oss möjligheten att göra en facetterad sökning. Härefter lade vi fokus på projektets andra front, själva indexeringen och sökningen. Apache Lucene Vårt mål blev nu att hitta en indexeringsteknik som lämpar sig för våra förehavanden. Apache Lucene är en javabaserad indexeringsteknik där objekt indexeras vilket i slutändan möjliggör ultrasnabb fulltextsökning. Vi hittade olika sökmotorer som byggde på detta. Vi gjorde en undersökning och vårt val stod till slut mellan Apaches egna Solr och en fransk utmanare vid namn Elastic Search. Vi bestämde oss till slut för Elastic Search, främst för dess något enklare dokumentation. Det gav ett mer lättillgängligt intryck. Elastic Search Elastic Search är en sökmotor som indexerar dokument och gör sökningar med hjälp av JSON-formatet över HTTP. Vi hade alltså möjlighet att direkt ställa frågor till indexet via enkla requests i adressfältet. Dock kändes detta som en något ostrukturerad tillvägagångssätt och att bygga ett eget ramverk mot detta kändes som en övermäktig uppgift. Lyckligtvis för sid 6
oss fanns det redan ett ramverk att tillgå som erbjöd ett färdigt bibliotek med metoder och som var anpassat för.net. Nest, som ramverket hette, lämpade sig för våra intentioner. Nest Nest är ett open source-projekt som erbjuder användaren möjlighet att dels indexera och dels ställa frågor mot indexet i.net. Man använder sig av färdiga klasser och metoder som bygger upp JSON-strängar som sedan används mot Elastic Search. Nest erbjuder möjligheten att bygga upp ett sökfilter på ett dynamiskt och lättillgängligt sätt. Detta gav oss alltså möjligheten att förverkliga de önskemål som Meridium hade satt upp. Metodik Vi hade som mål att följa den klassiska metodiken kring projektskapande. Ett agilt framförande innefattande alla konstens regler. En inledande inception-fas med kravbestämning och visionsförfattande följt av en elaboration-fas bestående av inledande programmering. Dessa två faser skulle sedan följas av construction- och transition-fasen. Vi insåg på ett tidigt stadium att vårt projekt var svårt att applicera på denna modell och att större delen av projektet skulle komma att kretsa kring de två första faserna. Eftersom uppdraget väckte så många frågetecken gick utan överdrift mer än hälften av tiden åt till att förstå uppgiften och leta information kring de olika teknikerna. Själva implementeringen har främst bestått i att testa sig fram. Därför känner vi att vi knappt kom in i construction-fasen som enligt oss är mer förenlig med ett flyt i programmeringen där alla stoppbockar är undanröjda och programmeringen likt tåget går som på räls. Förfarande Vi inledde med att skapa ett testprojekt i Visual Studio för att få igång utvecklingsmiljön. Till vår utvecklingsmiljö krävdes att vi installerade Elastic Search, Meridiums klassbibliotek och Nest. Installationen av Elastic Search gick allt annat än smärtfritt. Den krävde att vi skapade miljövariabler i Windows. Detta var något som var långt i från självklart då instruktioner för detta saknades i Elastic Searchs dokumentation. Både Meridium och Nest installerades direkt in i Visual Studio genom Nuget. Detta upplevde vi som ett smidig tillvägagångssätt. Vi hittade ett demoprojekt på github som vi tog inspiration ifrån och som hjälpte oss att komma igång. Projektet, kallat Searchbox, gav oss insikt i hur man kan indexera dokument och hur man gör en enklare sökning på indexet. Vi skapade här ett eget projekt där vi lyckades få till ett fullt fungerande index samt en sökfunktion. I våran indexeringsfunktion kunde man lägga till dokument, uppdatera dessa samt radera dem från indexet. Därefter vände vi blicken mot facetthantering. Till vår hjälp här studerade vi den något bristfälliga dokumentationen av Nest. Den hjälpte oss in på rätt väg vilket slutligen resulterade i en fungerande facettsökning. Det vill säga att man får information om antal träffar en sökning ger beträffande kategorier. Ponera följande exempel: sid 7
Nils vill se sommarbilder han lagt till i imagevault. En sökning på "sommar" ger Nils följande resultat: Resultatet erbjuder nu Nils möjlighet att förfina sin sökning. Han kan här välja vilka kategorier som sökningen ska begränsas till. På så sätt får han en mer träffsäker sökning. Efter att vi hade fått upp en fungerande applikation som innefattade ovan nämnda exempel visade vi upp detta för Meridium. De var överlag nöjda med vad vi hade producerat. Det var dags att försöka ta vårt projekt till nästa nivå och inkludera en filtrerad sökning. Filtrerad sökning innebär att man ska kunna välja kategorier och andra egenskaper och inkludera dessa i sökningen. Nest erbjuder två potentiella lösningar på detta huvudbry, vi utforskade båda. Den ena innebär att man bygger en nästlad query i ett LINQ-liknande syntax. Den andra metoden använder sig av factory-metoder för att skapa JSON-objekt. Den andra metoden är lättare att skapa dynamiskt så vi skapade med hjälp av den en metod där man kunde skicka ett sökobjekt och få ut ett färdigt filter. Sökobjektet i sin tur bestod av en lista av kategorier, en lista av filter och en query. Ett filter kan vara av tre olika typer. And, Or eller Not och dessa kan man bygga ihop som man behagar för att få ut ett sammanställt filter som sen kan skickas som JSON till Elastic Search. I retur kommer ett resultatobjekt som man sen kan skicka till vyn och presentera. sid 8
VIII. Resultatbeskrivning/måluppfyllelse Med facit i hand, och alla bekymmer inräknade, så känner vi oss förhållandevis nöjda med vår prestation. Vi hann inte färdigt med allt vi hoppats på i och med att vi hade så pass lång startsträcka. Vi känner dock att vi har lyckats med en del av våra utsatta mål. Fasettsökningen och möjligheten att filtrera med hjälp av söktermer är baskrav som vi har klarat av. Vi har inte producerat någon ansenlig mängd kod eller någon estetiskt tilltalade produkt. Vad vi däremot tillskansat oss är en mångsidig kunskap om sökning och indexering. Man skulle kunna likna vår tid tillsammans mer som en studiecirkel än en produktskapande enhet. IX. Avvikelser/efterkalkyl Vi har misslyckats med kraven att göra lösningen generell och sökning på av användaren definierad metadata. Anledning till misslyckande är framförallt tidsbrist. Att göra lösningen generell bedömer vi som en stor uppgift så vi prioriterade annat framför den. Metadata hade vi förmodligen kunnat lösa med lite mer tid. Det är inte lätt att göra ett projekt inom ett område där vår kunskapsnivå från början låg på noll och där det dessutom var flera olika områden där vi var tvungna att skaffa kunskap innan vi kunde börja prestera. sid 9
X. Slutsats Sökning är uppenbarligen ett stort ämne med många aspekter och lösningar. En del simpla, andra oerhört avancerade. Att lyckas skapa en fullt funktionsduglig sökprodukt med begränsade förkunskaper och med en tidsram på tio veckor känns som en utopi. Om vi hade bemötts med ett liknande problem tidigare under utbildningens gång hade nog vårt resultat sett annorlunda ut. Åtminstone de fyra första veckorna av projektets sammanlagt tio lades på ren informationssökning och lärande. Man måste se på våra resultat med detta i åtanke. Vi ser även flera positiva sidor som ett resultatet av projektets utveckling. Vi har under resans gång kommit till berg som tillsynes varit obestigbara. Men genom hårt arbete och gott samarbete inom gruppen har vi tagit stora kliv kunskapsmässigt såväl som praktiskt. Positivt är även det resultat som vi faktiskt kan visa upp för meridium. Vi har visat på god arbetsmoral och kämpat på även när projektet gått i stå. Dokumentationen har skötts på ett bra sätt med tanke på svåra förutsättningar då inte projektet passat i mallen. Eftersom hela uppgiften till en början mest bestod i att leta fakta och undersöka tekniker hade vi otalet gruppmöten. Dessa fungerade mer som workshops där för projektet viktiga spörsmål avhandlades. Vår gruppdynamik har under projektets gång fungerat väl. Trots diverse förhinder höll vi ihop gruppen och diskussionen hölls levande under hela perioden. Det finns en viss risk när man arbetar på distans att projektutvecklingen avstannar. Frustrationen blir lätt stor när man sitter via Skype och försöker skapa något tillsammans. Våra möten med Meridium via länk föll lite under denna rubrik. Det var svårt att förstå varandra när man inte kunde använda hela sitt kroppsliga register samt när den tekniska kvaliteten i länkverktyget inte var den bästa. Man skulle kunna säga att vårt fysiska möte med Meridium i Kalmar gav dubbelt så mycket som alla distansmöten tillsammans. Man får en helt annan kontakt med sin kontrahent när man sitter ansikte mot ansikte och dryftar ditt och datt. Vi har under hela projektet upplevt informationsflödet mellan vår projektgrupp och kund som mycket gott. De frågor och funderingar vi har haft har vi omgående fått svar på. Vi har haft en kontinuerlig mailkonversation med Meridium som fungerat ypperligt. Summa summarum flera erfarenheter rikare. Dels kunskapsmässigt och dels gruppdynamiskt. Detta får stå som sammanfattning för denna period tillsammans. sid 10
XI. Förslag på vidareutveckling Förslagsvis tycker vi det är lämpligt att implementera det vi inte hann med. Vi har ju inte levererat någon färdig produkt men förhoppningsvis något att bygga vidare på. Verktygen Elastic Search och Nest verkar ha stor potential för denna typ av sökning. XII. Litteraturförslag Nest - http://nest.azurewebsites.net Elastic Search - http://www.elasticsearch.org Apache Lucene - http://lucene.apache.org/core Searchbox - https://github.com/searchbox-io/.net-sample Imagevault API - http://imagevault.se/en/documentation/api-documentation Nuget - http://nuget.codeplex.com/documentation Facetter får sökningen att flöda - http://blogg.siteseeker.se/index.php/2010/09/24/facetter-farsokningen-att-floda sid 11