• No results found

TribusSearch, en produktsökfunktion specificerad åt Systembolaget

N/A
N/A
Protected

Academic year: 2021

Share "TribusSearch, en produktsökfunktion specificerad åt Systembolaget"

Copied!
41
0
0

Loading.... (view fulltext now)

Full text

(1)

Sj ¨alvst ¨andigt arbete i informationsteknologi

16 juni 2017

TribusSearch, en

produkts ¨okfunktion specificerad ˚at

Systembolaget

Jakob Andersson

Lucas Kristiansson Herrera

Adrian Tyrevall

Meriton Bytyqi

(2)

Institutionen f ¨or informationsteknologi Bes ¨oksadress: ITC, Polacksbacken L ¨agerhyddsv ¨agen 2 Postadress: Box 337 751 05 Uppsala Hemsida: http:/www.it.uu.se Abstract

TribusSearch, en produkts ¨

okfunktion

specifi-cerad ˚at Systembolaget

Jakob Andersson

Lucas Kristiansson Herrera Adrian Tyrevall

Meriton Bytyqi

The aim of this work is to develop a new search function that will search through Systembolaget’s assortment. We have decided to call this search function TribusSearch. Systembolaget is currently using a search function with an inadequate search engine that is not capable of finding products if a search phrase contains misspellings or redundant words. The main purpose of TribusSearch is therefore to assist Systembolaget’s users to find the product they are searching for as easily and effectively as possible. This is done by offering tolerance of misspellings and displaying search suggestions in the search field, among other functions. The search function TribusSearch is built on the search engine Elasticsearch, which is a modern and well-known search engine.

The end result was a search function that tolerates redundant and insufficient input and also misspellings with at most one invalid character. The time it takes for TribusSearch to handle a database query is in average less than 200ms, which was the speed requirement for the search function. Another requirement was that TribusSearch must be able to handle 2000 simultaneous searches without compromising the speed requirement. This requirement was also fulfilled.

Extern handledare: Patrik Hovnell, Systembolaget AB Handledare: Tina Vrieler och Bj¨orn Victor

(3)

Sammanfattning

M˚alet med detta arbete ¨ar att utveckla en s¨okfunktion f¨or att s¨oka genom Systembolagets sortiment. Denna s¨okfunktion har vi valt att kalla TribusSearch. I dagsl¨aget anv¨ander Systembolaget en s¨okfunktion med en bristf¨allig s¨okmotor som inte ¨ar kapabel till att hitta produkter om en s¨okfras inneh˚aller stavfel eller ¨overfl¨odiga ord. TribusSearch syf-te ¨ar d¨arf¨or att hj¨alpa Syssyf-tembolagets anv¨andare att s˚a enkelt och effektivt som m¨ojligt hitta den produkt de letar efter. Detta uppn˚as genom att bl.a. tolerera stavfel och erbjuda s¨okf¨orslag i s¨okf¨altet. S¨okfunktionen TribusSearch ¨ar byggd p˚a s¨okmotorn Elasticse-arch, vilket ¨ar en modern och v¨alk¨and s¨okmotor.

Slutresultatet blev en s¨okfunktion som tolererar stavfel med h¨ogst ett felaktigt tecken samt tolererar ¨overfl¨odig och bristande indata. Tiden det tar f¨or TribusSearch att han-tera en databasfr˚aga ¨ar i genomsnitt mindre ¨an 200ms, vilket var snabbhetskravet p˚a s¨okfunktionen. Ett annat krav var att TribusSearch m˚aste kunna hantera 2000 s¨okningar samtidigt utan att bryta snabbhetskravet. ¨Aven detta krav uppn˚addes.

(4)

Inneh ˚all

1 Introduktion 1

2 Bakgrund 1

2.1 Uppdragsgivare . . . 1

2.2 S¨okmotorer . . . 2

3 Syfte, m˚al, och motivation 3 3.1 Syfte . . . 3 3.2 M˚al . . . 4 3.3 Motivation . . . 4 3.4 Avgr¨ansningar . . . 5 4 Relaterat arbete 5 4.1 Apotekets s¨okfunktion . . . 6 4.2 CDON:s s¨okfunktion . . . 6 4.3 Matsmarts s¨okfunktion . . . 6 5 Metod 6 5.1 JSON . . . 7 5.2 S¨okmotorer . . . 7 5.2.1 Elasticsearch . . . 8 5.2.2 Solr . . . 9 5.3 React . . . 10 5.4 Kommunikation . . . 10 6 Systemstruktur 11

(5)

6.1 S¨oksystem . . . 12

6.2 Inl¨aggning av data . . . 13

7 Krav och utv¨arderingsmetoder 14 7.1 Relevans . . . 14

7.2 Snabbhet . . . 15

7.3 Kapacitet . . . 15

8 Applikation 17 8.1 F¨orberedande fasen, tolkning samt hantering av sortimentet . . . 17

8.1.1 Kartl¨aggning . . . 17 8.1.2 Analys . . . 18 8.1.3 Ins¨attning av data . . . 19 8.2 S¨okning . . . 20 8.2.1 Databasfr˚agor . . . 20 8.2.2 Filtrering . . . 21 8.3 Gr¨anssnitt . . . 22 9 Utv¨arderingsresultat 24 9.1 Relevans . . . 24 9.1.1 Bristande indata . . . 25 9.1.2 Stavfel . . . 25 9.1.3 Overfl¨odig indata . . . .¨ 26

9.1.4 Presentation f¨or handledare . . . 27

9.2 Snabbhet och kapacitet . . . 28

(6)

10 Resultat och diskussion 30

11 Slutsatser 31

(7)

2 Bakgrund

1

Introduktion

Ordet ’s¨ok’ ¨ar starkt f¨orknippat med s¨oktj¨anster f¨or att s¨oka ¨over webben, d¨ar Google ¨ar den mest v¨alk¨anda. Fokus p˚a detta projekt ligger dock i s¨okning ¨over en webbutiks sor-timent, och inte ¨over webbsidor. En funktion f¨or att s¨oka genom ett sortiment ¨ar n˚agot som majoriteten av samtidens webbutiker erbjuder. Syftet att erbjuda detta str¨acker sig fr˚an att maximera webbutikens int¨akter till att enbart ge en b¨attre upplevelse f¨or webbu-tikens bes¨okare.

Vid framtagning av en s¨okfunktion best¨ams till stor del hur kunderna ska uppfatta funk-tionen, d˚a utvecklaren har m¨ojligheten att p˚averka vad anv¨andaren ska se vid varje s¨okning. Detta medf¨or ett stort ansvar hos utvecklaren, vilket g¨or att medvetna val ¨ar n¨odv¨andiga vid utvecklingen.

Detta projekt kommer att baseras p˚a s¨okmotorn Elasticsearch. Det ¨ar i dagsl¨aget en v¨alanv¨and s¨okmotor f¨or produkts¨ok, och dess popularitet v¨axer snabbt [10]. Bland deras kunder finns det m˚anga stora f¨oretag, s˚a som Ebay, Netflix och Microsoft [51].

Systembolaget anv¨ander just nu en f¨orlegad och ineffektiv s¨okmotor f¨or deras web-bapplikation. I TribusSearch anv¨ands Elasticsearch f¨or att p˚a ett snabbt och enkelt s¨att s¨oka igenom Systembolagets produkter och hitta det en kund letar efter, fr¨amst genom att s¨oka igenom varje produkts olika f¨alt. En produkt inneh˚aller flera av dessa skil-da f¨alt som bland annat beskriver produktens namn, producent och ˚arg˚ang. F¨orutom s¨okfunktionalitet ing˚ar ¨aven ett anv¨andargr¨anssnitt i TribusSearch. S¨okfunktionen kom-mer i slutet av projektet att demonstreras f¨or Systembolaget f¨or att visa att hur en pro-totyp av den modernare s¨okfunktion kan utformas och fungera.

2

Bakgrund

I denna sektion presenteras uppdragsgivaren Systembolaget och dess bakgrund. Detta f¨oljs av en bakgrundsbeskrivning av s¨okmotorer och s¨okfunktioner.

2.1

Uppdragsgivare

Gruppens uppdragsgivare och handledare ¨ar Patrik Hovnell, produkt¨agare f¨or System-bolagets webbsida och deras mobil-applikation. Hovnell har gett gruppen i uppgift att skapa en ny s¨okfunktion f¨or deras webbsida. Denna s¨okfunktion ¨ar t¨ankt att fungera som prototyp f¨or Systembolagets egna utvecklingsprojekt.

(8)

2 Bakgrund

Systembolaget bildades 1955 [35], och har i dagsl¨aget monopol p˚a butiksf¨ors¨aljning av alkoholhaltiga drycker i Sverige [1]. Systembolaget ¨ags av staten och oms¨atter 27,6 mil-jarder kronor [35]. Systembolagets webbsida tillsammans med deras mobil-applikation har cirka 1 miljon visningar i m˚anaden.

M¨ojligheten att s¨oka efter produkter ¨ar en funktion som de flesta webbutiker erbjuder i dagsl¨aget. Dessa s¨okfunktioner ¨ar oftast till f¨or att maximera f¨oretagets f¨ors¨aljning [6]. Detta g¨ors genom att bland annat rangordna produkter p˚a olika s¨att f¨or olika kunder, baserat p˚a kundens historik och k¨opvanor [39]. Systembolaget har som m˚al att minska alkoholkonsumtionen i Sverige, genom att s¨alja s˚a lite alkohol som m¨ojligt [46]. Tri-busSearch kommer d¨arf¨or att ej vara utformad f¨or att maximera f¨ors¨aljning, och d¨arav inte visa produkter beroende p˚a personlig information om anv¨andaren. Med personlig information menas exempelvis, platsinformation, ˚aldersgrupp och tidigare s¨okningar. TribusSearch kommer s˚aledes ta h¨ansyn till Systembolagets specifika m˚al, vilket kom-mer g¨ora TribusSearch till en specialiserad s¨okfunktion.

I dagsl¨aget ¨ar Systembolagets s¨okfunktion f¨orlegad. Den saknar automatisk komplet-tering av det anv¨andaren skriver in i s¨okf¨altet och tolkar indata bokstavligt. Med bok-stavlig tolkning menas att ett litet stavfel g¨or det om¨ojligt f¨or s¨okfunktionen att f¨orst˚a indatan. Detta medf¨or att produkter som t.ex. ’Tr3 Apor’ inte hittas vid inmatning av ’Tre Apor’, vilket utg¨or ett exempel p˚a s¨okfunktionens brist p˚a anv¨andarv¨anlighet.

2.2

S ¨

okmotorer

En s¨okmotor ¨ar ett program som anv¨ander s¨okord och letar efter dokument som mat-char de krav s¨okorden specificerar [48]. Ett dokument ¨ar ett objekt som lagrats i en databas och inneh˚aller information. Vid en s¨okning j¨amf¨ors den inmatade datan med do-kumentens inneh˚all, d¨ar inneh˚allet specificeras vid inmatning i databasen. En s¨oktj¨anst eller en s¨okfunktion ¨ar ett program som anv¨ander en s¨okmotor. En av de mest k¨anda s¨oktj¨ansterna ¨ar Googles s¨oktj¨anst, som anv¨ander en s¨okmotor f¨or s¨okning efter webb-sidor. Detta projekt kommer behandla s¨okmotorer som anv¨ands av webbutiker f¨or att s¨oka ¨over deras produkter.

En s¨okmotor som blivit allt mer vanlig f¨or att s¨oka genom ett sortiment [10] ¨ar Elasticse-rach. Elasticsearch ¨ar en open-source s¨okmotor skriven i programmeringsspr˚aket Java [15]. Att mjukvara ¨ar open-source inneb¨ar att k¨allkoden f¨or mjukvaran ¨ar ¨oppen att h¨amta f¨or alla. Vad som g¨or Elasticsearch unikt ¨ar hur resultaten fr˚an s¨okningar hands-kas; beroende p˚a hur s¨okningen ¨ar utformad f˚ar varje resultatet en po¨ang, score, som

(9)

3 Syfte, m˚al, och motivation

s¨ager hur v¨al resultatet matchar med s¨okfrasen [54, p. 11]. S¨okresultaten sorteras sedan i avtagande ordning efter deras po¨ang. Det s¨okresultat som fick den h¨ogsta po¨angen kommer s˚aledes att visas f¨orst.

S¨okmotorer kan optimeras beroende p˚a hur s¨okningar ska ske och hur dokumenten den ska s¨oka genom ¨ar uppbyggda. Detta sker bland annat genom att best¨amma vilka da-tabasfr˚agor som anv¨ands och hur dokumenten struktureras vid inl¨aggningen av data. En s¨okfunktion ¨ar egentligen bara en eller flera databasfr˚agor som k¨ors av en s¨okmotor beroende p˚a anv¨andarens s¨okning. Den nuvarande s¨okfunktion som anv¨ands av System-bolaget ¨ar optimerad f¨or att s¨oka genom st¨orre sammanh¨angande texter. Information om produkter behandlas som ett enda stort textf¨alt ist¨allet f¨or flera f¨alt som beskriver olika delar av produkten. Detta resulterar i att s¨okfunktionen s¨oker genom hela produktbe-skrivningen ¨aven om det skulle vara tillr¨ackligt att s¨oka genom ett f˚atal f¨alt. En s˚adan typ av s¨okning ¨okar m¨angden text som bearbetas, vilket i sin tur ¨okar s¨oktiden.

3

Syfte, m ˚al, och motivation

3.1

Syfte

Syftet med detta arbete ¨ar att utveckla en ny och f¨orb¨attrad s¨okfunktion f¨or Systembo-laget. Denna s¨okfunktion skall sedan fungera som en prototyp f¨or Systembolagets eg-na utvecklingsprojekt. S¨okfunktionen ska acceptera stavfel och aneg-nan icke-fullst¨andig indata och samtidigt ge ¨onskv¨arda och relevanta resultat. Med relevanta resultat menas produkter som har samma eller liknande information som det som s¨okes. S¨okfunktionen ska d¨aremot inte vara utformad p˚a ett s¨att som kan ¨oka webbsidans f¨ors¨aljning.

Den nuvarande s¨okfunktionen som Systembolaget anv¨ander ¨ar inte optimerad f¨or hur deras produkter ¨ar beskrivna. Detta resulterar i att s¨okresultat p˚averkas drastiskt vid stav-fel och bristande samt ¨overfl¨odig indata. TribusSearch kommer att underl¨atta anv¨and-andet av Systembolagets s¨okfunktion, genom att kontinuerligt ge s¨okf¨orslag mot det anv¨andaren skriver in i s¨okf¨altet. Den kommer ¨aven att ¨oka antalet relevanta produkter vid s¨okningar ¨aven om indatan saknar exakt matchande dokument. Detta inneb¨ar till exempel att om en anv¨andare vill hitta ¨olm¨arket ’Kung’ men ist¨allet r˚akar skriva ’Knug’ kommer det ¨onskade resultatet ¨and˚a att visas.

(10)

3 Syfte, m˚al, och motivation

3.2

M ˚al

M˚alet med detta arbete ¨ar att utveckla en ny s¨okfunktion f¨or Systembolagets produkt-s¨okfunktion. S¨okningar efter produkter kan delas upp i tre anv¨andarfl¨oden. Med anv¨andar-fl¨ode menas en kategori av s¨okningar som har gemensamma egenskaper. Det f¨orsta anv¨andarfl¨odet utg¨ors av direkta s¨okningar efter specifika produkter. Det andra anv¨andar-fl¨odet ¨ar s¨okningar p˚a typer som land och etiketter. Det tredje anv¨andaranv¨andar-fl¨odet utg¨ors av mer diffusa s¨okningar, t.ex. efter distrikt, smak eller druva. M˚alet ¨ar s˚aledes att s¨okfunktionen ska kunna hantera dessa tre anv¨andarfl¨oden. S¨okfunktionen ska ¨aven uppfylla f¨oljande kriterier:

1. Ge anv¨andaren relevanta resultat och ranka dessa p˚a ett l¨ampligt s¨att. Med ranka menas att r¨akna ut hur v¨al ett resultat matchar indatan. S¨okfunktionen m˚aste visa anv¨andaren det den letar efter. Vad som ¨ar ett relevant svar och hur dessa rankas kommer att baseras p˚a en m¨angd olika faktorer, d¨ar det mest grundl¨aggande ¨ar antalet s¨okord i s¨okningen som matchar produktinformationen.

2. Ge snabba s¨okresultat. F¨or att s¨okfunktionen ska ge anv¨andaren en bra upplevelse m˚aste den vara snabb och ge n¨ast intill omedelbar feedback vid input.

3. Tolerera m¨anskliga brister. S¨okfunktionen m˚aste kunna interpretera vad en bristf¨allig s¨okning avser. En s˚adan brist kan utg¨oras av t.ex. ett stavfel, ¨overfl¨odiga ord i s¨okningen eller andra saker som kan vara sv˚ara att tolka f¨or en maskin.

4. Kunna hantera ett stort antal anv¨andare. D˚a Systembolagets webbsida har ett stort antal bes¨okare m˚aste s¨okfunktionen kunna hantera att m˚anga anv¨andare g¨or s¨okningar samtidigt. Ett stort antal anv¨andare definieras i detta fall godtyckligt till 2000.

3.3

Motivation

Arbetet motiveras fr¨amst av att ¨oka effektiviteten vid produkts¨okningar f¨or Systembo-lagets kunder. Eftersom att kunder inte alltid vet exakt vilken produkt de letar efter s˚a kan det vara problematiskt att hitta enstaka matchande produkter i sortimentet. Den nu-varande s¨okmotorn som anv¨ands ¨ar optimerad f¨or att s¨oka genom st¨orre textfiler och tar inte h¨ansyn till m¨anskliga skrivfel och tolkar indata bokstavligt.

Det finns stora f¨ordelar med att ist¨allet anv¨anda sig av Elasticsearch som s¨okmotor. Fr¨amst d˚a den kan hantera stora m¨angder data snabbt, ¨ar mer anpassad till m¨anskliga fel och ger resultat n¨astintill i realtid.

(11)

4 Relaterat arbete

Systembolaget har tiotusentals produkter samt ett stort antal bes¨okare varje dag [40]. Detta g¨or det aktuellt att f¨ornya s¨okfunktionen, d˚a det kan hj¨alpa anv¨andare att hitta vad de letar efter snabbare och enklare.

3.4

Avgr ¨ansningar

D˚a designen av anv¨andargr¨anssnittet inte var det huvudsakliga m˚alet i detta projekt s˚a avgr¨ansades projektet till att fokusera p˚a sj¨alva s¨okfunktionen. Med detta menas att inga detaljerade analyser av gr¨anssnittet kommer att g¨oras, som till exempel val av f¨argteman samt placering av komponenter s˚asom s¨okf¨alt och kategorifilter.

Projektet har ¨aven avgr¨ansat kompatibilitet bland olika webbl¨asare. Under arbetes g˚ang anv¨andes Google Chrome [20] f¨or att utveckla och testa systemet. Anledningen till att kompatibilitet bland olika webbl¨asare inte implementerades var f¨or att projektet endast skulle vara en prototyp f¨or en ny s¨okfunktion. Resultatet blir att funktionalitet som inte inkluderats i andra webbl¨asare inte tas till h¨ansyn. Microsofts Internet Explorer [32] ¨ar den webbl¨asare d¨ar detta blir mest tydligt d˚a TribusSearch inte kommer att existera i denna webbl¨asare.

S¨akerhet kommer heller inte tas till h¨ansyn under utvecklingen av TribusSearch. Med s¨akerhet menas skydd fr˚an anv¨andare som vill g¨ora skada mot Elasticsearch-servern. Som tidigare n¨amnt kommer s¨okfunktionen endast att anv¨andas som en prototyp f¨or Systembolaget. Implementation av s¨akerhet kommer att ske i en senare fas ¨an prototyp-fasen d˚a fokus i detta projekt fr¨amst ligger p˚a s¨okfunktionens faktiska funktionalitet.

4

Relaterat arbete

I detta kapitel j¨amf¨ors TribusSearch med Apotekets, CDONs samt Matsmarts s¨okfunktioner. Motiveringen bakom att j¨amf¨ora TribusSearch med just dessa s¨okfunktioner grundar sig fr¨amst i att de ¨ar inspirationsk¨allor till TribusSearch. J¨amf¨orelsen kommer att avgr¨ansas till att endast j¨amf¨ora skillnader i gr¨anssnitt och funktionalitet. Anledningen till detta grundar sig i brist p˚a information om tekniken bakom de relaterade s¨okfunktionerna. Gemensamt f¨or samtliga s¨okfunktioner som presenteras ¨ar att de alla har n˚agon form av automatisk komplettering. Med detta menas att f¨orslag p˚a produkter, fraser och kate-gorier ges kontinuerligt under tiden anv¨andaren skriver i s¨okf¨altet. En annan gemensam faktor ¨ar att dessa s¨okfunktioner tolererar stavfel. Dessa funktioner kommer ¨aven att vara implementerade i TribusSearch.

(12)

5 Metod

4.1

Apotekets s ¨

okfunktion

Patrik Hovnell, gruppens uppdragsgivare och handledare, refererade till Apotekets s¨ok-funktion [5] f¨or inspiration till TribusSearch. En olikhet mellan Apotekets s¨oks¨ok-funktion och TribusSearch ¨ar rekommendationer av andra produkter. N¨ar en kund har hittat en produkt p˚a Apotekets webbsida och klickat p˚a den visas f¨orutom information om pro-dukten ¨aven en vy med titeln Andra k¨opte ¨aven. Denna vy h¨anvisar kunden till relatera-de produkter. En s˚adan vy kommer inte finnas i TribusSearch, d˚a en s˚adan vy kan ¨oka f¨ors¨aljningen vilket g˚ar emot Systembolagets uppdrag att inte s¨alja mer ¨an vad en kund i f¨orv¨ag har planerat att k¨opa.

4.2

CDON:s s ¨

okfunktion

S¨okfunktionen f¨or CDON [8] tillhandah˚aller likt Apotekets s¨okfunktion automatisk komplettering. CDON:s s¨okfunktion ger ¨aven s¨okf¨orslag p˚a sidor och vanliga s¨okfraser. Produkterna som visas under automatisk komplettering ¨ar inte rangordnade p˚a samma s¨att som n¨ar den huvudsakliga s¨okningen g¨ors. Det vill s¨aga n¨ar anv¨andaren trycker p˚a knappen med f¨orstoringsglaset. Ett exempel p˚a detta ¨ar att om en anv¨andare skriver ’lol’ i s¨okf¨altet f˚ar den upp f¨orslag p˚a produkter, och dessa produkter ¨ar inte samma pro-dukter som hittas n¨ar anv¨andaren trycker p˚a ’s¨ok’. Detta tyder p˚a att s¨okfunktionen g¨or olika sorters s¨okningar vid automatisk komplettering och huvuds¨okning. Detta kommer inte att implementeras i TribusSearch, d˚a vi inte ser n˚agra f¨ordelar med det.

4.3

Matsmarts s ¨

okfunktion

Matsmarts s¨okfunktion [31] skiljer sig fr˚an de tidigare n¨amnda s¨okfunktionerna i att fokus vid automatisk komplettering ligger i att visa s¨okf¨orslag av fraser och inte i form av produkter. Detta skiljer sig fr˚an TribusSearch, d¨ar fokus ist¨allet ligger i att visa mat-chande produkter. Liksom i fallet med CDON:s s¨okfunktion k¨ors olika s¨okningar i au-tomatisk komplettering och den huvudsakliga s¨okningen.

5

Metod

De tv˚a fundamentala delarna i TribusSearch utg¨ors av en s¨okmotor och en klientsi-da. S¨okmotorn kommer att byggas p˚a Elasticsearch, och klientsidan kommer att ut-vecklas i gr¨anssnittsramverket React. Dessa verktyg f¨orklaras samt motiveras under

(13)

5 Metod

respektive sektion. Kommunikationen mellan klienten och Elasticsearch-servern sker via HTTP (Hyper Text Transfer Protocol). HTTP ¨ar ett protokoll som fr¨amst anv¨ands vid ¨overf¨oring av webbsidor [23]. HTTP kommunikation sker med hj¨alp av s˚a kallade HTTP-f¨orfr˚agningar. Dessa f¨orfr˚agningar kan vara i olika format och inneh˚alla olika sorters information beroende p˚a om en klient vill beg¨ara information fr˚an servern, el-ler skicka information till dito [24]. Med hj¨alp av HTTP-f¨orfr˚agningar skickas s¨okdata, fr˚an klient till server, genom databasfr˚agor skrivna i det textbaserade formatet JSON. JSON f¨orklaras mer ing˚aende i kommande sektion.

5.1

JSON

JSON, JavaScript Object Notation, ¨ar ett plattformsoberoende textbaserat dataformat som anv¨ands frekvent vid kommunikation mellan servrar och klienter [11]. Vid kommu-nikation mellan en klient och server anv¨ands oftast text, vilket g¨or JSON objekt effektiva inom webbutveckling. JSON objekt kan ¨overs¨attas till klartext, d.v.s. vanlig text som in-te har formain-terats. JSON anv¨ands alltid f¨or kommunikation med en Elasticsearch-server [27] och ¨ar s˚aledes inget vi valt sj¨alvmant att anv¨anda.

Ett exempel p˚a ett JSON objekt kan vara: {

”Namn ” : ” Tr3 Apor ” , ” Land ” : ” S v e r i g e ” , }

5.2

S ¨

okmotorer

Denna sektion inleds med f¨orklaringar av grundl¨aggande begrepp som ¨ar n¨odv¨andiga f¨or att f¨orst˚a hur s¨okmotorer fungerar. Detta f¨oljs av en f¨orklaring av s¨okmotorerna Elasticsearch och Solr [41]. Det g¨ors ¨aven en j¨amf¨orelse av dessa s¨okmotorer, samt argumentation varf¨or TribusSearch valde att anv¨anda Elasticsearch framf¨or Solr som sin s¨okmotor.

Ett flertal av dagens mest anv¨anda s¨okmotorer ¨ar byggda p˚a Apache Lucene, vilket ¨ar ett open-source bibliotek skrivet i Java [28]. Lucene anv¨ander sig av tekniken full-text s¨okning, vilket inneb¨ar att s¨okning efter en specifik s¨okfras g¨ors genom samtliga doku-ment och dess inneh˚all i en databas [18]. Apache Lucene erbjuder olika rankingalgorit-mer f¨or s¨okningar. Med detta menas att algoritrankingalgorit-mernas syfte ¨ar att rangordna resultaten p˚a s˚a s¨att att det mest relevanta svaret ska rankas h¨ogst [28].

(14)

5 Metod

Ett centralt begrepp f¨or att f¨orst˚a hur m˚anga s¨okmotorer anropas ¨ar RESTful API. API st˚ar f¨or ’Application programming interface’ och kan f¨orklaras som en samling regler f¨or hur ett bibliotek ska anropas av applikationer [4]. ’REST’ i RESTful API st˚ar f¨or ’Representational State Transfer’. Principen bakom ett RESTful API ¨ar att en klient ska kunna anropa en server via denna API, ¨aven om klienten har begr¨ansad information av servern [38]. Servern i detta exempel kan utg¨oras av t.ex. en s¨okmotor, eller n˚agon annan typ av server.

5.2.1 Elasticsearch

Elasticsearch ¨ar en open-source s¨okmotor skriven i Java. I Elasticsearch lagras data i JSON objekt, som l¨aggs in som dokument och ges nycklar [54, p. 12] som g¨or dokument urskiljbara. Elasticsearch ¨ar inte en relationsbaserad databas. Detta betyder bland annat att ingen struktur beh¨over f¨ordefinieras innan dokumenten fylls med data. Detta medf¨or att nya kategorier av data kan l¨aggas till i efterhand, utan att ¨andra p˚a n˚agon struktur. Detta ¨ar inte m¨ojligt i en relationsbaserad databas [12].

Kommunikationen till och fr˚an en Elasticsearch server g¨ors med HTTP-f¨orfr˚agningar och databasfr˚agor skrivna som JSON objekt [54, p. 17]. Vad som g¨or Elasticsearch unikt ¨ar hur resultaten fr˚an s¨okningar hanteras. Vid s¨okningar f˚ar varje dokument en po¨ang beroende p˚a dess relevans till s¨okningen [54, p. 11]. Ett dokument som har en stark relevans mot vad som s¨oks efter f˚ar en h¨ogre po¨ang ¨an ett dokument som har en vagare. Relevansen beror p˚a hur bra ett dokument matchar vad som s¨oks efter i en databasfr˚aga. Det som avg¨or hur bra ett dokument matchar en s¨okning ¨ar hur likt det som st˚ar i dokumentet ¨ar s¨okorden [50]. Elasticsearch databasfr˚agor ¨ar upp emot 1000 g˚anger snabbare ¨an SQL databasfr˚agor som k¨ors p˚a samma h˚ardvara [55]. Detta skapar en markant skillnad i s¨oktider och ¨ar ett starkt argument f¨or att anv¨anda Elasticsearch. Elasticsearch g¨or det m¨ojligt att dela upp alla dokument ¨over mer ¨an endast en ser-ver. De uppdelade servrarna, noderna, bildar tillsammans ett kluster [14]. Klustret kan beskrivas som vad som binder noderna tillsammans och best¨ammer vart databasfr˚agor ska k¨oras. Detta g¨or det m¨ojligt att balansera ut s¨okningar vid eventuell ¨overbelastning. Varje nod i Elasticsearch best˚ar av ett godtyckligt antal index. Ett index kan f¨orklaras som en underkategori till varje Elasticsearch-server som dokument med olika typer kan grupperas under. Ett index kan j¨amf¨oras med en specifik ’databas’ i en relationsbaserad databas [49]. Varje index best˚ar i sin tur av ett antal typer, vilket kan j¨amf¨oras med en tabell i en relationsbaserad databas. Varje typ inneh˚aller i sin tur ett antal f¨alt. Dessa kan j¨amf¨oras med kolumner i en relationsbaserad databas. En utmaning vid anv¨andning av Elasticsearch ¨ar hur data ska f¨ordelas mellan olika typer och n¨ar ett nytt index beh¨over

(15)

5 Metod

skapas [25]. Processen n¨ar dessa index skapas och fylls med dokument kallas indexe-ring.

F¨or att s¨oka ¨over ett index anv¨ands en form av databasfr˚agor. Den vanligaste och mest grundl¨aggande av dessa ¨ar den s˚a kallade ’match’ f¨orfr˚agningen [30]. I denna f¨orfr˚agning specificeras ett f¨alt och ett v¨arde, och samtliga objekt d¨ar f¨altet och v¨ardet ¨ar ekvivalenta kommer att returneras.

Nedan visas ett exempel p˚a hur en ’match’ f¨orfr˚agning kan se ut. { ” q u e r y ” : { ” m a t c h ” : { ” m e s s a g e ” : ” t h i s i s a t e s t ” } } }

Denna f¨orfr˚agning skulle returnera samtliga dokument vars f¨alt ’message’ inneh˚aller v¨ardena ’this’, ’is’, ’a’, ’test’ eller kombinationer av dessa ord. Elasticsearch delar upp s¨oktermer och dokuments f¨altv¨arden best˚aende av text till en lista av ord, om inte en annan s˚a kallad analysator har specificerats. Mer om detta f¨orklaras i kapitel 8.

Ett antal exempel p˚a st¨orre f¨oretag och organisationer som g˚att ¨over till att anv¨anda Elasticsearch ¨ar Ebay, Dell, Facebook och Microsoft. Dell har lagt mest fokus p˚a att anv¨anda Elasticsearch till att analysera hur bra deras databasfr˚agor fungerar, vilka pro-dukter som ¨ar mest eftertraktade och vilka deras mest bes¨okta kategorier ¨ar. Detta g¨oras genom att spara vad anv¨andaren g¨or och databasfr˚agorna som anv¨ands.

5.2.2 Solr

Ett alternativ till att anv¨anda Elasticsearch hade varit att anv¨anda Solr. Solr ¨ar en s¨okmotor vilken liksom Elasticsearch ¨ar byggd p˚a Apache Lucene. Detta medf¨or att de tekniska skillnaderna mellan Elasticsearch och Solr ¨ar sm˚a [42]. En olikhet ¨ar att Elasticsearch har en mer utvecklad RESTful API. En annan skillnad ¨ar att Solr ¨ar mer anpassat f¨or enbart full-text s¨okning, och inte mer avancerade databasfr˚agor eller funktioner som fil-trering och gruppering av s¨okresultat [43]. Vi valde att anv¨anda Elasticsearch och inte Solr p˚a grund av detta kombinerat med en rekommendation fr˚an uppdragsgivaren att anv¨anda Elasticsearch.

(16)

5 Metod

5.3

React

React ¨ar ett open-source ramverk anpassat f¨or att skapa anv¨andargr¨anssnitt. Huvudprin-cipen med React ¨ar att kunna ¨andra specifika segment av data och element utan att beh¨ova uppdatera hela webbsidan [36]. React ¨ar komponentbaserat, vilket inneb¨ar att segment som anv¨ands i React-kod ¨ar uppdelade i komponenter [37]. Kommunikationen mellan komponenterna ¨ar enkelriktad och egenskaper hos en komponent m˚aste tolkas av en webbl¨asare f¨or att synas och uppdateras [53, p. 10]. En av Reacts huvudsakli-ga styrkor ¨ar att dessa komponenter g˚ar att ˚ateranv¨anda, b˚ade inom och mellan olika projekt.

F¨or att f¨orst˚a hur React fungerar, och flera av dess styrkor, ¨ar det n¨odv¨andigt att f¨orst f¨orst˚a begreppet DOM (Document Object Model). DOM kan f¨orklaras som strukturen och uppdelningen av ett HTML-dokumentet [21]. Varje separat del av sidan delas med denna teknik upp i s˚a kallade DOM-dokument [22]. Det ¨ar med hj¨alp av denna struktur som JavaScript kan anv¨andas f¨or att uppdatera specifika delar i ett HTML-dokument. Ett v¨asentligt tillkortakommande med traditionell webbprogrammering med enbart HTML och JavaScript, ¨ar att uppdatering av DOM:en sker l˚angsamt [47].

F¨or att kompensera f¨or bristen att DOM:en uppdateras l˚angsamt anv¨ander React ¨aven en virtuell DOM som sparas i minnet. Vid uppdatering av DOM:en sker eventuella ¨andringar till en b¨orjan oavkortat i den virtuella DOM:en. Denna ¨andring blir sedan utvidgad till det reella DOM-dokumenten, d¨ar endast de dokument som ¨ar ber¨orda av ¨andringen uppdateras. Med hj¨alp av denna teknik blir eventuella ¨andringar i DOM:en snabbare med hj¨alp av React. Detta medf¨or i sin tur att React ¨ar ett bra val av ramverk vid utveckling av webbsidor vars anv¨andargr¨anssnitt uppdateras frekvent, vilket ¨ar fallet i detta projekt.

React-syntax kan beskrivas som en kombination av HTML och JavaScript. Koden kan d¨arf¨or se ut som en blandning av JavaScript och HTML.

5.4

Kommunikation

N¨ar en webbklient kommunicerar via HTTP med en server som inte ¨ar webbservern som skickade webbsidan g¨or den en cross-origin f¨orfr˚agning [52]. F¨or att detta ska vara m¨ojligt kr¨avs det att systemet till˚ater CORS (cross origin resource sharing) [52]. Denna teknik till˚ater i TribusSearch fall att webbklienten kan kommunicera direkt med Elasticsearch-servern. Alternativet hade varit att l˚ata klienten skicka s¨okningarna till webbservern, som sedan skickar dessa vidare till ett Elasticsearch API. En cross-origin f¨orfr˚agning till˚ater s˚aledes systemet att g˚a ett steg ist¨allet f¨or tv˚a. Detta g¨or att varje

(17)

6 Systemstruktur

s¨okning g¨ors snabbare med hj¨alp av cross-origin f¨orfr˚agning, vilket resulterar i att den tekniken ¨ar att f¨oredra.

6

Systemstruktur

TribusSearch ¨ar uppdelat i tv˚a huvudsakliga delsystem. Ett av delsystemen best˚ar av sj¨alva s¨okningen, se den gr¨ona markeringen i figur 1. Det vill s¨aga extrahering av data fr˚an en Elasticsearch-server, samt visualisering av denna data. Detta delsystem utg¨ors av en webbserver, en Elasticsearch-server samt en webbklient. Det andra delsystemet (se den bl˚aa markeringen i figur 1) behandlar organisering samt hantering av inmatning av data i servern. Delsystemet omfattar en klient samt en Elasticsearch-server. Det som kopplar samman dessa delsystem ¨ar s˚aledes endast Elasticsearch-servern. Kommunikationen mellan de olika komponenterna i b˚ada delsystemen sker oavkortat via HTTP-f¨orfr˚agningar, vilket f¨orklaras och motiveras i sektion 5.4.

(18)

6 Systemstruktur

Figur 1: Visar hela systemet. Delsystemen skiljs ˚at av rektanglarna d¨ar den bl˚aa rek-tangeln omfattar delsystemet f¨or inmatning av data, och den gr¨ona f¨or extrahering och visualisering av dito.

6.1

S ¨

oksystem

Systemet f¨or s¨okning i TribusSearch utg¨ors av en webbserver, en Elasticsearch-server samt en webbklient. Klienten f¨or detta delsystem har direktkontakt med b˚ade webb-servern och Elasticsearch API:n, och ¨ar s˚aledes den komponent som kopplar samman systemet. Denna teknik kallas CORS, och beskrivs mer ing˚aende i kapitel 5. Cross-origin f¨orfr˚agningar g¨or det m¨ojligt f¨or webbklienten att skicka databasfr˚agor direkt till Elasticsearch-servern. Detta illustreras i figur 2.

(19)

6 Systemstruktur

Figur 2: Visar s¨oksystemets systemstruktur. Anv¨andaren kommunicerar direkt med b˚ade Elasticsearch-servern samt webbservern.

Syftet med webbservern i detta delsystem ¨ar endast att leverera webbsidor till klienten. Den enda webbsidan som f¨orses till klienten ¨ar indexsidan. Indexsidan ¨ar en webbsida som till˚ater klienten att skicka s¨okningar till Elasticsearch-servern. Webbservern ¨ar ge-nererad av ett program f¨or att skapa webbservrar till React-applikationer och ¨ar s˚aledes inte utvecklad av oss. Elasticsearch-servern anv¨ands f¨or datalagring. H¨ar lagras System-bolagets produktsortiment. Denna server ¨ar designad av oss. Med detta menas att alla dokuments index, datatyper och egenskaper har best¨amts av oss innan datalagringen gjorts.

Klienten utg¨ors av ett webbgr¨anssnitt som ¨ar utvecklat av oss med hj¨alp av front-end ramverket React. Syftet med klienten ¨ar att underl¨atta utvecklingsprocessen samt visu-alisera s¨okningar f¨or anv¨andaren, m¨ojligg¨ora filtrering och rangordning av s¨okresultat.

6.2

Inl ¨aggning av data

Delsystemet f¨or inl¨aggning av data best˚ar av en administrat¨or samt en Elasticsearch-server. Administrat¨oren i delsystemet kommunicerar med Elasticsearch-servern med hj¨alp av NodeJS, vilket ¨ar ett programsystem vars huvudsakliga syfte ¨ar att skapa

(20)

webb-7 Krav och utv¨arderingsmetoder

servrar [34]. Denna klient utg¨ors till st¨orsta del av ett f¨ardigskrivet bibliotek som anv¨ands f¨or att skapa ett index i Elasticsearch-servern och l¨agga in Systembolagets sortiment i detta index.

7

Krav och utv ¨arderingsmetoder

Kraven p˚a TribusSearch kan delas upp i krav p˚a relevans, snabbhet samt att kunna han-tera s¨okningar fr˚an ett stort antal anv¨andare. TribusSearch kommer att j¨amf¨oras med den befintliga s¨okfunktionen under slutet av projekttiden. S¨okningar kommer att g¨oras p˚a b˚ada systemen och resultaten kommer sedan att j¨amf¨oras. Denna j¨amf¨orelse kommer att ske separat med h¨ansyn till respektive krav.

7.1

Relevans

Relevanta s¨okresultat ska kunna f˚as ¨aven om anv¨andaren inte vet exakt vad den s¨oker ef-ter eller endast har en liten eller diffus beskrivning av det den s¨oker efef-ter. S¨okfunktionen ska kunna ranka s¨okresultatet p˚a ett relevant s¨att efter anv¨andarens s¨okning, utan att g¨ora s¨okningen f¨or komplicerad. Vad som ¨ar det mest relevanta s¨attet att rangordna s¨okresultat p˚a kan vara problematiskt att m¨ata, d˚a s¨okresultatets relevans ofta ¨ar tve-tydig till vad anv¨andaren vill. Evaluering av tvetve-tydig och entve-tydig relevans kommer d¨arf¨or att separeras. Till tvetydig relevans h¨or s¨okningar som kan tolkas p˚a olika s¨att, och inte har ett entydigt svar. Ett exempel p˚a detta ¨ar s¨okningen ’Vin Sverige’, d¨ar m˚anga anv¨andare bara vill se resultat som ¨ar av varugruppen ’Vin’ fr˚an landet ’Sveri-ge’. Vissa anv¨andare kan vara ute efter produkter av olika varugrupper fr˚an den svens-ka leverant¨oren ’G¨otene Vin och Spritfabrik AB’ med samma s¨okord. Entydig relevans utg¨ors av fall d¨ar s¨okningen har ett vedertaget svar. Till entydig relevans h¨or till exempel s¨okningar som inneh˚aller existerande kategorier. Med detta menas att en s¨okning som inneh˚aller frasen ’Vitt vin’ alltid ska se f¨orslaget ’vitt vin’ under f¨oreslagna kategorier.

¨

Aven s¨oktermer inneh˚allande stavfel, ¨overfl¨odiga ord eller brist p˚a indata ska resultera i relevanta tr¨affar. H¨ar ska s¨okfunktionen kunna hantera stavfel med h¨ogst ett felaktigt tecken. Med tolerans av h¨ogst ett felaktigt tecken menas att en s¨okterm ¨ar till˚aten att sakna ett tecken, inneh˚alla ett ¨overfl¨odigt tecken eller inneh˚alla ett tecken som ¨ar felpla-cerad med som h¨ogst ett avst˚and av 1. Ett avst˚and av 1 inneb¨ar till exempel:

’kung’ felstavat som ’kugn’ tolereras ’kung’ felstavat som ’kgnu’ tolereras ej

(21)

7 Krav och utv¨arderingsmetoder

Motivering till avgr¨ansning till ett tecken grundar sig i att hantering av fler tecken skulle kr¨ava mer ber¨akningstid (se sektion 8.2.1).

Med brist p˚a indata menas att s¨okningar d¨ar exempelvis endast en del av produktnamnet skrivs in ska den hitta produkten. Till exempel ska resultatet fr˚an s¨okordet ’morgan’ ¨aven inkludera produkter med namnet ’captain morgan’. Utv¨ardering av detta sker genom att g¨ora s¨okningar med olika stavfel, ¨overfl¨odiga ord samt bristande indata i TribusSearch samt i Systembolagets nuvarande s¨okfunktion, och sedan j¨amf¨ora resultaten. Ett annat krav ¨ar att s¨okresultat vars namn ¨ar exakt detsamma som s¨okfrasen alltid ska rankas h¨ogre ¨an en produkt d¨ar s¨okfrasen ¨ar en del av namnet.

Diffusa s¨okningar som t.ex ’Frankrike r¨ott vin fr˚an 2007’ kommer bed¨omas separat. F¨or att evaluera denna tvetydiga relevans kommer vi ut¨over j¨amf¨orelsen med Systembola-gets nuvarande s¨okfunktion att anv¨anda oss av ˚aterkoppling fr˚an uppdragsgivaren, vilket ¨ar en metod som uppdragsgivaren f¨oreslagit. Ett absolut krav f¨or denna typ av relevans g˚ar d¨arf¨or inte att specificera.

7.2

Snabbhet

Kravet p˚a snabbhet baseras p˚a att s¨okfunktionen ska vara snabbare ¨an Systembolagets nuvarande s¨okfunktion. Exakt hastighet f¨or en s¨okning p˚a Systembolagets nuvarande s¨okfunktion beror p˚a flera faktorer som inte g˚ar att p˚averka, t.ex hur h¨og belastning det ¨ar p˚a n¨atverket vid en viss tidpunkt, anv¨andarens geografiska plats samt hastigheten p˚a anv¨andarens internetuppkoppling. Detta medf¨or att det blir problematiskt att g¨ora en korrekt j¨amf¨orelse av TribusSearch och Systembolagets nuvarande s¨okfunktion d˚a denna kommer att variera f¨or varje anv¨andare. Kravet s¨atts d¨arf¨or enbart till att varje s¨okning i TribusSearch inte ska ta mer ¨an 200 millisekunder, n¨ar klienten och systemet k¨ors p˚a samma enhet. Siffran 200 baseras p˚a ett krav fr˚an projektets uppdragsgivare Patrik Hovnell.

F¨or att m¨ata hastigheten av en databasfr˚aga i Elasticsearch anv¨ander vi f¨altet ’Took’ som returneras av Elasticsearch vid varje utf¨ord databasfr˚aga. Took m¨ater endast hur l˚ang tid det tar f¨or Elasticsearch-server att behandla databasfr˚agor, och inte tiden f¨or transport mellan klient och server.

7.3

Kapacitet

Eftersom att antalet anv¨andare av Systembolagets s¨okfunktion kan vara h¨ogt ¨ar det vik-tigt att TribusSearch kan hantera att m˚anga anv¨ander tj¨ansten samtidigt. Kravet ¨ar att

(22)

7 Krav och utv¨arderingsmetoder

TribusSearch ska klara av att hantera 2000 s¨okningar samtidigt, utan att kompromissa p˚a snabbhetskravet.

F¨or att m¨ata TribusSearch kapacitet anv¨ands programmet Apache JMeter. Apache JMe-ter ¨ar en applikation vars huvudsakliga syfte ¨ar att m¨ata prestandan hos servrar [26]. Under testen l˚ater vi JMeter utf¨ora simulationer av hur TribusSearch fungerar. F¨orsta testet best˚ar av att JMeter simulerar 2000 anv¨andare, som samtidigt skickar en data-basfr˚aga till Elasticsearch-servern. Det andra testet best˚ar av en simulering av 1000 anv¨andare som skickar tv˚a databasfr˚agor samtidigt. F¨or varje test anv¨ands tre olika ty-per av databasfr˚agor. Vilka dessa databasfr˚agor ¨ar och vad de g¨or beskrivs i sektion 8.2.1. Variationen av databasfr˚agor skapade en mer realistisk simulering av testerna. JMeter tillhandah˚aller sedan information om minimum, maximum, medianen samt me-delv¨ardet av tiden det tog f¨or TribusSearch server att utf¨ora dessa databasfr˚agor. Kravet ¨ar att maximiv¨ardet ska vara l¨agre ¨an minimikravet p˚a snabbhet, vilket ¨ar 200 millise-kunder.

(23)

8 Applikation

8

Applikation

Applikationen best˚ar av tre delar vilket f¨orklarades i sektion 6.1. Dessa ¨ar en Elasticsearch-server, en webbserver samt en klientsida skriven i React. I det h¨ar kapitlet beskrivs hur dessa delar implementeras och konfigureras. I sektion 8.1 f¨orklaras processen f¨or att indexera Systembolagets sortiment med Elasticsearch, samt f¨orberedningen av detta. I sektion 8.2 redog¨ors implementationen av s¨okningen ¨over sortimentet. Denna del be-handlar vilka databasfr˚agor som anv¨ants, samt n¨ar dessa anv¨ants. I sektion 8.3 beskrivs implementationen av gr¨anssnittet.

8.1

F ¨

orberedande fasen, tolkning samt hantering av

sorti-mentet

Indexeringen av Systembolagets sortiment ¨ar en process som sker i flera steg. Dessa steg utg¨ors av kartl¨aggning, analys, samt ins¨attning av data. Dessa f¨orklaras mer ing˚aende under respektive sektion. Syftet med denna del ¨ar att l¨agga in Systembolagets sortiment i Elasticsearch-klustret p˚a ett optimalt s¨att.

Varje produkt som l¨aggs in i klustret inneh˚aller f¨alten:

Produkt namn, Koscher, Ekologisk, Etiskt, Land, Varugrupp,

Artikel ID, Leverant¨or, Producent, F¨orpackning, ˚Arg˚ang

8.1.1 Kartl ¨aggning

Med Elasticsearch ¨ar det m¨ojligt att i f¨orv¨ag kartl¨agga hur ett dokument och dess f¨alt ska lagras och indexeras innan sj¨alva indexeringsprocessen [29]. Detta innefattar bland annat att kunna definiera vilka f¨alt som ska tolkas som t.ex. en siffra, text, eller ett datum. Innan indexeringen av Systembolagets sortiment s˚a definierades alla f¨alt som endast bestod av siffror som siffror. F¨alt som beskrevs med booleska v¨arden(sant eller falskt) definierades som booleska v¨arden. F¨alt med datum beskrevs som datum och alla andra f¨alt definierades som text.

Kravet som kr¨aver att en tr¨aff med en exakt matchning av en produkts namn ska rankas som mest relevant uppn˚addes genom att kopiera f¨altet f¨or produktens namn och det sekund¨aranamnf¨altet till ett gemensamt f¨alt med namnet ’Hela Namnet’. Det sekund¨ara namnf¨altet beskriver oftast vilken produktvariant en viss produkt ¨ar. En produkt kan t.ex.

(24)

8 Applikation

ha namnet ’CCCP’ och det sekund¨ara namnet ’Vodka’. F¨altet ’Hela Namnet’ kommer s˚aledes vara ’CCCP Vodka’.

8.1.2 Analys

F¨or att Elasticsearch ska kunna tolka data som l¨aggs in i f¨alten och j¨amf¨ora denna text med anv¨andarens s¨oktermer beh¨over texten som l¨aggs in i f¨alten analyseras. Ett enkelt exempel p˚a detta ¨ar att alla bokst¨aver ska g¨oras om till gemener. Detta ¨ar n¨odv¨andigt f¨or att det inte ska spela n˚agon roll om s¨okningar g¨ors med versaler eller gemener. Ett annat exempel ¨ar att l˚ang text m˚aste delas upp i fraser, s˚a att en s¨okning inte m˚aste inneh˚alla hela texten utan kan matcha en av fraserna. Hur ett f¨alt vars v¨arde best˚ar av text konverteras till tecken eller termer g¨ors allts˚a under analys-fasen [2]. Analysen utf¨ors av s˚a kallade analysatorer. Elasticsearch inneh˚aller flera f¨ordefinierade analysatorer men det finns ¨aven m¨ojlighet att skapa sina egna anpassade analysatorer f¨or varje index i klustret. En analysator best˚ar av tre komponenter; character filter, tokenizers samt token filter[3].

Ett character filter tolkar text som enstaka tecken och anv¨ands f¨or att l¨agga till, ta bort eller ¨andra tecken i den originella texten.

En tokenizer delar upp en text till s˚a kallade tokens. Vad ett token ¨ar beror p˚a hur tokeni-zern ¨ar konfigurerad. Om ingen tokenizer har specificerats av anv¨andaren blir ett token ett ord och texten delas upp i en lista av dessa ord.

Ett token filter anv¨ands f¨or att l¨agga till, ta bort eller ¨andra tokens. Att ¨andra ett to-ken kan t.ex. inneb¨ara att ¨andra ett toto-ken till sm˚a bokst¨aver, att filtrera bort vanligt f¨orekommande ord som t.ex.0the0 i Engelska, eller att ¨andra ord fr˚an plural till singular. Exempelvis skulle den inbyggda engelska analysatorn tolka texten

"The QUICK brown foxes jumped over the lazy dog!"

som

[ quick, brown, fox, jump, over, lazy, dog ]

Denna process utf¨ors i syfte att kunna definiera vilka s¨oktermer som ska resultera i en tr¨aff. I ovanst˚aende exempel skulle t.ex. s¨oktermerna 0quick0 och 0dog0 resultera i en tr¨aff.

(25)

8 Applikation

D˚a TribusSearch ska erbjuda automatisk komplettering av indata s˚a skapades en analy-sator som anv¨ander en s˚a kallad edge ngram-tokenizer [13]. Denna tokenizer anpassa-des och implementeraanpassa-des s˚a att texten

"Kung"

tolkas som

["K", "Ku", "Kun", "Kung"]

Genom att anv¨anda denna tokenizer skulle t.ex. s¨okning av0Kun0 i produktnamn-f¨altet resultera i en tr¨aff i dokumentet f¨or produkten0Kung0. Ett token filter av typ lowercase implementerades ¨aven i analysatorn. Det detta token filter g¨or ¨ar att konvertera alla tecken till sm˚a bokst¨aver, s˚a att s¨okresultaten inte p˚averkas av versaler och gemener av de inmatade bokst¨averna. Denna analysator anv¨andes p˚a f¨alten som beskrev namn, koscher, ekologiskt och etiskt.

F¨or att hantera ¨overfl¨odig indata fr˚an anv¨andaren implementerades ett s˚a kallat stoppord token filter [45] i en analysator d¨opt till ’standard stop’. Stoppord ¨ar ord som filtreras ut vid s¨okningar. Detta betyder att om en anv¨andare skulle s¨oka efter ’ ¨Ol och vitt vin’ kom-mer s¨okfunktionen endast att s¨oka efter ’¨ol vitt vin’. Anv¨andandet av stoppord resulterar i att ord som kan f¨orekomma frekvent i dokument men som oftast inte ¨ar relevanta fil-treras ut i s¨okresultaten. Implementering av stoppord gjordes p˚a f¨oljande vis:

"standard_stop": {

"type": "standard",

"stopwords": ["och", "fr˚an", "som", "¨ar", "i"] }

Alla andra f¨alt anv¨ande Elasticsearch standard analysator [44]. Denna analysator delar upp en s¨okfras i termer och inkluderar ¨aven ett token filter av typen lowercase.

8.1.3 Ins ¨attning av data

Elasticsearch inneh˚aller ett API som kallas f¨or Bulk API [7]. Det till˚ater de som hanterar servern att utf¨ora flera indexeringsoperationer p˚a en enda g˚ang. Det ¨ar med denna metod som Systembolagets sortiment indexerades.

(26)

8 Applikation

D˚a Systembolagets sortiment var lagrat som en XML-fil [16] och Elasticsearch endast indexerar JSON-filer konverterades XML-filen till JSON [9]. Denna JSON-fil var utfor-mad som en enda l˚ang lista av JSON-objekt. Indexeringsprocessen ¨ar anpassningsbar f¨or hur JSON-objekten ska tolkas och detta utnyttjades f¨or f¨alt som beskrev om en produkt var koscher, etisk eller ekologisk. Dessa f¨alt var i det originella sortimentet antingen beskrivna med 1 eller 0, d¨ar 1 innebar sant och 0 innebar falskt. Under f¨orberedningen av indexeringen ¨oversattes f¨altens v¨arden ist¨allet till text, i syfte att kunna identifiera om en anv¨andare har skrivit in t.ex. ’Koscher’ i s¨okf¨altet. All annan data kopierades direkt utan modifiering fr˚an den originella sortiment-filen.

8.2

S ¨

okning

Implementationen av TribusSearch s¨okfunktion ¨ar uppdelad i en prelimin¨ar samt en hu-vudsaklig s¨okfunktion. Den prelimin¨ara s¨okfunktionen aktiveras varje g˚ang anv¨andaren skriver ett tecken i s¨okf¨altet, och databasfr˚agor skickas direkt till Elasticsearch-servern. Den huvudsakliga s¨okfunktionen aktiveras varje g˚ang anv¨andaren trycker p˚a knappen ’s¨ok’. ¨Aven detta resulterar i att databasfr˚agor skickas till Elasticsearch-servern.

De databasfr˚agor som skickas till Elasticsearch-klustret varierar beroende p˚a vad anv¨andaren har skrivit in i s¨okf¨altet. TribusSearch inneh˚aller en lista av nuvarande data-basfr˚agor; det vill s¨aga databasfr˚agor som kommer st¨allas utefter anv¨andarens s¨oktermer. Initialt best˚ar denna lista av tv˚a prim¨ara databasfr˚agor. Dessa tv˚a databasfr˚agor f¨orklaras i sektion 8.2.1. Om dessa databasfr˚agor inte resulterar i n˚agra tr¨affar finns det ¨aven en annan lista som inneh˚aller fyra sekund¨ara databasfr˚agor. Dessa f¨orfr˚agningar k¨ors sedan separat i en f¨orutbest¨amd ordning, tills n˚agon ger ett resultat. Om ingen av dessa data-basfr˚agor ger n˚agot resultat betyder det att TribusSearch inte hittar n˚agot resultat som matchar den inmatade s¨okfrasen.

8.2.1 Databasfr ˚agor

Det finns tre olika typer av databasfr˚agor som anv¨ands i TribusSearch. Dessa diskuteras i denna sektion.

TribusSearch ska kunna visa relevanta resultat om en anv¨andare har specificerat flera olika krav i s¨okf¨altet. Ett exempel p˚a detta ¨ar att en s¨okning efter ’italien ¨ol ekolo-gisk’ ska visa produkter som ¨ar ekologiska, av varugruppen ¨ol, samt fr˚an landet Italien. Detta inneb¨ar att TribusSearch m˚aste s¨oka igenom samtliga f¨alt och visa resultaten d¨ar dessa tre termer f¨orekommer i n˚agon av produktens f¨alt. F¨or att uppn˚a detta anv¨ands Elasticsearch inbyggda databasfr˚aga Multi Match[33]. Det multi match g¨or ¨ar att s¨oka

(27)

8 Applikation

genom flera specificerade f¨alt samtidigt. F¨or TribusSearch sattes parametern ’type’ till ’cross fields’, och parametern ’operator’ sattes till ’and’. Att typen ¨ar cross fields in-neb¨ar i praktiken att alla specificerade f¨alt under s¨okningen sammanfogas till ett ge-mensamt f¨alt. Med operator parametern satt till ’and’ menas att alla termer i s¨okf¨altet m˚aste hittas i n˚agot av f¨alten av en produkt f¨or att det ska vara ett matchande resultat. Med dessa parameterv¨arden kommer de krav som anv¨andaren st¨aller i s¨okf¨altet alltid att uppn˚as, f¨orutsatt att alla termer ¨ar r¨attstavade.

Som tidigare n¨amnt i sektion 7 ska TribusSearch tolerera felstavningar med h¨ogst ett fel-aktigt tecken. F¨or att implementera st¨od f¨or detta i teori s¨atts v¨ardet av parametern ’fuzzi-ness’ till 1 f¨or samma multi match databasfr˚aga som diskuterats i ovanst˚aende stycke [19]. Elasticsearch till˚ater dock inte anv¨andning av ’fuzziness’ vid en multi match data-basfr˚aga av typ cross field. Detta problem l¨ostes med kartl¨aggning. Genom att manuellt kopiera alla f¨alt som s¨oks igenom till ett nytt f¨alt, ’all’, ¨ar det m¨ojligt att utf¨ora en vanlig match databasfr˚aga med parametern ’fuzziness’ satt till 1. Det som egentligen gjorts ¨ar att imitera cross field multi match databasfr˚agans beteende fast med tillagd ’fuzziness’. Detta medf¨or att varje f¨alt som s¨oks igenom i databasfr˚agan tolererar stavfel.

De f¨alt som s¨oks igenom ¨ar:

Produkt namn, Koscher, Ekologisk, Etiskt, Land, Varugrupp,

Artikel ID, Leverant¨or, Producent, F¨orpackning, ˚Arg˚ang

F¨or att uppn˚a kravet som s¨ager att en exakt matchning av en produkts namn ska rankas som mest relevant anv¨andes ˚aterigen en multi match databasfr˚aga. Med denna databas-fr˚aga sattes dock parametern ’type’ till ’most fields’. Med en s˚adan ’type’ kombineras po¨angen av matchningar i varje enskilt f¨alt. De f¨alt som s¨oktes igenom var:

Produkt namn, Sekund¨art produktnamn, Hela produktnamnet

Denna multi match databasfr˚aga med ’type’ ’most fields’ tillsammans med multi match cross fields databasfr˚agan ¨ar de databasfr˚agor som initialt skickas till Elasticsearch-servern. Om dessa tv˚a inte resulterar i n˚agra tr¨affar anv¨ands multi match cross fields databasfr˚agan med ’fuzziness’.

8.2.2 Filtrering

TribusSearch erbjuder anv¨andaren m¨ojlighet att filtrera s¨okresultaten. Denna filtrering-en kan ske i kategorierna ’Land’, ’Varugrupp’ samt ’Pris’. Varje g˚ang filtrering-en anv¨andare g¨or

(28)

8 Applikation

en filtrering av s¨okresultaten k¨ors en ny databasfr˚aga, med ett inlagt filter p˚a det valda f¨altet. Detta sker med Elasticsearch inbyggda filterfunktion [17]. Med hj¨alp av denna kan vi specificera att ett f¨alt m˚aste inneh˚alla ett s¨arskilt v¨arde f¨or att den produkten ska ing˚a i resultatet. I exemplet nedanf¨or illustreras hur resultatet kan filtreras till att endast inneh˚alla produkter vars varugrupp ¨ar vitt vin.

"filter": { "term": {

"Varugrupp": "Vitt vin" }

}

8.3

Gr ¨anssnitt

Klientens gr¨anssnitt utg¨ors av flera komponenter d¨ar de huvudsakliga ¨ar s¨okf¨alt, f¨orhandsvisning, filtrering samt visning av s¨okresultat. I komponenten s¨okf¨alt skriver anv¨andaren in den

¨onskade s¨okfrasen. Denna komponent illustreras i figur 3

Figur 3: Visar s¨okf¨altet d¨ar anv¨andaren skriver in ¨onskad s¨okfras.

Automatisk kompletteringen visar anv¨andaren f¨orslag p˚a produkter vid inmatning av tv˚a eller fler tecken. Den automatiska kompletteringen visar enbart produktens namn och inte dess andra f¨alt, se figur 4. Om anv¨andaren klickar p˚a n˚agon av resultaten dirigeras denne till informationen om produkten i fr˚aga.

(29)

8 Applikation

Figur 4: Visar resultaten av s¨okkomplettering vid s¨okning av frasen ’Kung’.

TribusSearch erbjuder anv¨andaren m¨ojlighet att filtrera s¨okresultaten. Denna filtreringen kan ske i kategorierna ’Land’, ’Varugrupp’ samt ’Pris’. Det finns ¨aven m¨ojlighet att sortera samtliga attribut i antingen stigande eller fallande ordning. Produkterna sorteras initialt efter relevans i fallande ordning. Med relevans menas rangordningspo¨ang. Detta illustreras i figur 5.

(30)

9 Utv¨arderingsresultat

Figur 5: Visar huvudresultaten vid s¨okning av frasen ’Kung’. Notera att Systembolagets logotyp samt alla resultat inte f˚ar plats p˚a bilden.

9

Utv ¨arderingsresultat

I detta kapitel presenteras resultat fr˚an utv¨arderingarna. Resultaten har delats upp i re-levans, samt snabbhet och kapacitet.

9.1

Relevans

J¨amf¨orelsen med avseende p˚a relevans skedde genom att j¨amf¨ora Systembolagets nuva-rande hemsida med TribusSearch, f¨or att sedan utv¨ardera skillnaderna. Det som testades var hur b˚ada s¨okfunktionerna hanterade bristande indata, stavfel och ¨overfl¨odig indata.

(31)

9 Utv¨arderingsresultat

9.1.1 Bristande indata

Att ge resultat trots bristande indata inneb¨ar att en s¨okning efter ’apor’ resulterar i tr¨affar av till exempel produkter med namn ’tr3 apor’, se figur 6.

Figur 6: S¨okningen efter ’apor’ med Systembolagets nuvarande s¨okfunktion, till v¨anster samt motsvarande s¨okning med TribusSearch, till h¨oger.

9.1.2 Stavfel

Kravet p˚a TribusSearch var att den bland annat skulle tolerera stavfel med h¨ogst en felaktig bokstav. Den felstavade frasen ’tre apror’ ist¨allet f¨or ’tr3 apor’ anv¨andes f¨or att testa detta. I figur 7 illustreras hur Systembolagets nuvarande s¨okfunktion hanterar detta.

Figur 7: Resultatet fr˚an s¨okningen av ’tre apror’ med Systembolagets nuvarande s¨okfunktion.

Figur 8 illustrerar resultatet av att s¨oka med stavfel av en bokstav med TribusSearch. S¨okfrasen ’tre apror’ resulterar i samma resultat som av att s¨oka efter ’tr3 apor’. Termen som resulterar i en tr¨aff ¨ar ’apor’ och termen ’tre’ har allts˚a ingen p˚averkan i denna s¨okning. Termen ’apror’ inneh˚aller endast ett ¨overfl¨odigt tecken, ’r’, och detta hanteras av TribusSearch.

(32)

9 Utv¨arderingsresultat

Figur 8: S¨okningen efter ’tre apror’ med TribusSearch.

9.1.3 Overfl ¨¨ odig indata

TribusSearch ignorerar s¨okfraser inneh˚allande termerna ’och’, ’fr˚an’, ’och’, ’som’, ’¨ar’, ’i’

Som illustreras i figur 9 resulterar en s¨okfras inneh˚allande n˚agon av dessa termer i att de ignoreras i s¨okningen med TribusSearch. Detta g¨ors inte i Systembolagets nuvarande s¨okfunktion, vilket illustreras i figur 10.

(33)

9 Utv¨arderingsresultat

Figur 9: S¨okning efter ’kung i burk’ med TribusSearch.

Figur 10: S¨okningen efter ’kung i burk’ p˚a Systembolaget.

9.1.4 Presentation f ¨or handledare

Projektet presenterades ¨aven f¨or uppdragsgivaren Patrik Hovnell och han blev tillfreds-st¨alld av resultatet. Det saknas dock en del funktioner innan TribusSearch kan anses vara en komplett s¨okfunktion. Exempel p˚a detta ¨ar m¨ojlighet att s¨oka p˚a smak, distrikt eller druva. Denna funktionalitet tillhandah¨olls av Systembolagets nuvarande s¨okfunktion.

(34)

9 Utv¨arderingsresultat

9.2

Snabbhet och kapacitet

Resultaten fr˚an kapacitets- och hastighetstesterna beskrivs i denna sektion. Resultaten av kapacitetstesterna beskrivs i de tre olika tabellerna 1, 2 och 3. De genomsnittliga resultaten fr˚an kapacitetstesterna anv¨andes f¨or att utv¨ardera hastighetskravet. Varje ta-bell beskriver resultaten fr˚an JMeter med olika databasfr˚agor. Raderna beskriver vilket deltest varje kolumn tillh¨or till. Rader och kolumner f¨orklaras som,

• run: vilken omg˚ang av deltest resultaten tillh¨or

• max: l¨angsta testtiden f¨or en databasfr˚aga i millisekunder • min: kortaste testtiden f¨or en databasfr˚aga i millisekunder • avg: genomsnittliga testtiden f¨or en databasfr˚aga i millisekunder • SR: andel databasfr˚agor som gett resultat i procent.

(35)

9 Utv¨arderingsresultat

Tabell 2: Simuleringsresultat fr˚an test 2

Tabell 3: Simuleringsresultat fr˚an test 3

9.3

Diskussion av utv ¨arderingsresultat

Testerna f¨or kapacitet visar att en st¨orre m¨angd anrop till Elasticsearch-servern orsakar variationer i hastigheten. Resultatet av test 2 visar en stor skillnad i j¨amf¨orelse mot de andra testerna. Detta beror troligtvis p˚a att arbetsm¨angden p˚a systemet som anv¨ands f¨or testerna var f¨or h¨og. De genomsnittliga hastigheterna p˚a testen ¨ar l¨agre ¨an vad som var f¨orv¨antat. Detta syntes tydligt mot slutet av testerna d˚a hastigheten ¨okade gradvis. Datorn som anv¨ands f¨or att k¨ora testerna och Elasticsearch-servern var inte ett system optimerat f¨or att fungera som en server. Ett mer optimerat serversystem hade troligt-vis h¨ojt den l˚angsammaste hastigheten, vilket hade gett ¨annu mer realistiska resultat. Sammanfattningsvis kan vi konstatera att resultaten fr˚an kapacitetstesterna uppfyllde kapacitetskravet i fem av sex tester.

(36)

10 Resultat och diskussion

Test 2 hade en h¨ogre genomsnittlig hastighet och anledningarna bakom detta ¨ar samma som beskrevs i den f¨oreg˚aende sektionen. Den genomsnittliga hastigheten ¨over alla tes-ter ut¨over test 2 var sju millisekunder per databasfr˚aga. D˚a testresultaten utkom fr˚an en simulering med h¨og arbetsm¨angd f¨or Elasticsearch-servern var det ett lovande resultat. D˚a Elasticsearch-servern inte alltid kommer att vara under s˚adan arbetsm¨angd kommer den realistiska genomsnittliga hastigheten var vagt snabbare. Med en genomsnittliga hastighet som inte ¨overskreds 13 millisekunder f¨orutom i test 2 anses hastighetskravet uppfyllt.

10

Resultat och diskussion

M˚alen med TribusSearch var att utveckla en s¨okfunktion som hanterar stavfel och bris-tande samt ¨overfl¨odig indata, ger relevanta s¨okresultat, samt erbjuder automatisk kom-plettering medan anv¨andaren skriver i s¨okf¨altet. S¨okfunktionen skulle ¨aven kunna utf¨ora databasfr˚agor p˚a mindre ¨an 200ms i genomsnitt, samt tolerera 2000 databasfr˚agor sam-tidigt utan att kompromissa hastighetskravet.

Av dessa m˚al kan vi konstatera att samtliga har uppn˚atts till en viss grad. S¨okfunktionen st¨odjer automatisk komplettering av indata, d¨ar max fem av resultaten visas under s¨okf¨altet i takt med inmatning av s¨okord. ¨Aven stavfel tolereras till en viss gr¨ans som ¨ar satt till h¨ogst ett felaktigt tecken. Ett s¨okord kan inneh˚alla ett ¨overfl¨odigt tecken eller inneh˚alla ett tecken som ¨ar felplacerat med som h¨ogst ett avst˚and av h¨ogst ett tecken.

S¨okfunktionen ¨ar kapabel till att identifiera kategorier (varugrupper och l¨ander) fr˚an tex-ten i s¨okf¨altet, f¨orutsatt att textex-ten ¨ar r¨attstavad. Ett exempel p˚a detta kan vara vid s¨okning p˚a ’ ¨Ol’ eller ’Tyskland’. Dessa identifierade kategorier dyker upp under s¨okf¨altet, av vil-ka anv¨andaren har m¨ojlighet att klicvil-ka p˚a. Trycker man p˚a n˚agon av dessa vil-kategorier s˚a sker en s¨okning efter produkter som tillh¨or den kategori som man har klickat p˚a. Med v˚ara resultat kan vi konstatera att Elasticsearch var ett bra val av s¨okmotor. Den har givit oss de n¨odv¨andiga funktionaliteter och m¨ojlighet att en st¨orre m¨angd olika databas-fr˚agor. ¨Aven andra verktyg, som NodeJS och JMeter har varit passande och underl¨attat arbetet. En sak som skulle kunna gjorts annorlunda ¨ar att inte anv¨anda ramverket React, eftersom att det tog l˚ang tid att l¨ara sig och inte anv¨andes till sin fulla potential.

Om vi j¨amf¨or TribusSearch med Apotekets s¨okfunktion, som presenterades i relatera-de arbeten anser vi att TribusSearch ¨ar snabbare p˚a att f¨orsl˚a kategorier. En f¨orrelatera-del med Apotekets s¨okfunktion ¨ar att den f¨oresl˚ar fraser vid s¨okning, en funktion som Tribus-Search saknar. TribusTribus-Search v¨aljer ist¨allet att visa resultat som inneh˚aller en term som p˚aminner om det felstavade ordet.

(37)

12 Framtida arbete

11

Slutsatser

Resultatet av projektet ¨ar en ny s¨okfunktion som ¨ar anpassad till Systembolagets sorti-ment. Denna s¨okfunktion ¨ar byggd s˚a att den underl¨attar samt hj¨alper anv¨andaren att hit-ta bland Systembolagets sortiment. Dethit-ta g¨ors med hj¨alp av olika funktioner, bland an-nat automatisk komplettering, hantering av stavfel och att kunna matcha med de termer som anv¨andaren skriver i s¨okf¨altet. Med matcha menas till exempel att anv¨andaren en-dast vill se produkter som ¨ar ekologiska. Projektet underl¨attar s¨okandet f¨or anv¨andaren och ger resultat som ¨ar relevanta oberoende p˚a om information saknas fr˚an anv¨andarens s¨okning. Den nya s¨okfunktionen visar en markant f¨orb¨attring p˚a s¨okresultat med bris-tande och felstavad indata j¨amf¨ort med Systembolagets nuvarande s¨okfunktion, vilket kan ses som en ut¨okning av anv¨andarv¨anligheten.

12

Framtida arbete

Ett f¨orsta steg i att f¨orb¨attra TribusSearch skulle vara att l¨agga in mer s¨okbar data om produkterna i databasen. Denna data skulle t.ex. kunna vara druvor, vindistrikt, eller aktuell lagerstatus hos butikerna. D˚a tekniken f¨or att implementera denna redan finns i TribusSearch skulle det vara m¨ojligt att implementera detta f¨orutsatt att r¨att data tillhan-dah¨olls av uppdragsgivaren.

Ett till steg i vidareutveckling av TribusSearch skulle kunna vara att implementera s¨okning av flera oberoende fraser samtidigt. Det enklaste exemplet att beskriva den-na brist i TribusSearch ¨ar vid s¨okning efter tv˚a olika l¨ander. Den nuvarande versionen av TribusSearch letar efter produkter som inneh˚aller b˚ada dessa l¨ander i n˚agot f¨alt och hittar s˚aledes inget resultat. Ett f¨orb¨attrat TribusSearch skulle kunna visa alla resultat som har ett f¨alt som inneh˚aller ett av dessa l¨ander.

En mer avl¨agsen vidareutveckling skulle kunna vara att implementera n˚agon form av maskinl¨arning f¨or s¨okfunktionen. Detta skulle kunna anv¨andas f¨or att l¨ara s¨okfunktionen vilka produkter som m˚anga kunder tittar p˚a, och d¨arf¨or ranka dessa h¨ogre vid s¨okningar. Om en s˚adan funktion ligger inom Systembolagets riktlinjer g˚ar dock att ifr˚agas¨atta, d˚a detta skulle kunna ¨oka f¨ors¨aljningen av alkoholhaltiga drycker.

(38)

Referenser

Referenser

[1] “Alkohollagstiftning i sverige,” accessed: 2017-04-09. [Online]. Available: http://www.iq.se/sv/fakta-om-alkohol/lagstiftningen

[2] “Analysis,” accessed: 2017-05-10. [Online]. Available: https://www.elastic.co/ guide/en/elasticsearch/reference/current/analysis.html

[3] “Anatomy of an analyzer,” accessed: 2017-05-10. [Online]. Available: https: //www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html [4] “Api,” accessed: 2017-05-06. [Online]. Available: https://en.wikipedia.org/wiki/

Application programming interface

[5] “Apoteket,” accessed: 2017-04-22. [Online]. Available: https://www.apoteket.se/ [6] “Building a search engine for e-commerce,”

acces-sed: 2017-04-01. [Online]. Available: http://dogdogfish.com/guide/ building-a-search-engine-for-e-commerce-with-elasticsearch/

[7] “Bulk api,” accessed: 2017-05-10. [Online]. Available: https://www.elastic.co/ guide/en/elasticsearch/reference/current/docs-bulk.html

[8] “Cdon,” accessed: 2017-05-10. [Online]. Available: http://cdon.se/

[9] “Convert xml to json,” accessed: 2017-05-10. [Online]. Available: http: //convertjson.com/xml-to-json.htm

[10] “Db-engines ranking - trend of elasticsearch popularity,” accessed: 2017-05-30. [Online]. Available: https://db-engines.com/en/ranking trend/system/ Elasticsearch

[11] “Discovering javascript object notation.” [Online]. Available: http://ieeexplore. ieee.org.ezproxy.its.uu.se/document/6178118/

[12] “document-oriented,” accessed: 2017-06-01. [Online]. Avai-lable: https://developer.couchbase.com/documentation/server/3.x/developer/ dev-guide-3.0/compare-docs-vs-relational.html

[13] “Edge ngram tokenizer,” accessed: 2017-05-10. [Onli-ne]. Available: https://www.elastic.co/guide/en/elasticsearch/reference/current/ analysis-edgengram-tokenizer.html

[14] “Elasticsearch, basic concepts,” accessed: 2017-04-23. [Online]. Available: https: //www.elastic.co/guide/en/elasticsearch/reference/current/ basic concepts.html

(39)

Referenser

[15] “Elasticsearch, restful, distributed search and analytics,” accessed: 2017-04-22. [Online]. Available: https://www.elastic.co/products/elasticsearch

[16] “Extensible markup language (xml),” accessed: 2017-05-10. [Online]. Available: https://www.w3.org/XML/

[17] “Filter,” accessed: 2017-05-11. [Online]. Available: https://www.elastic.co/guide/ en/elasticsearch/reference/current/query-dsl-filtered-query.html

[18] “Full-text search,” accessed: 2017-04-22. [Online]. Available: https://docs. microsoft.com/en-us/sql/relational-databases/search/full-text-search

[19] “Fuzziness,” accessed: 2017-05-14. [Online]. Available: https://www.elastic.co/ guide/en/elasticsearch/guide/current/fuzziness.html

[20] “Google chrome,” accessed: 2017-05-15. [Online]. Available: https://www. google.com/chrome

[21] “Html dom,” accessed: 2017-04-28. [Online]. Available: https://www.w3schools. com/js/js htmldom.asp

[22] “Html dom-document,” accessed: 2017-04-28. [Online]. Available: https: //www.w3schools.com/js/js htmldom document.asp

[23] “Http,” accessed: 2017-04-28. [Online]. Available: https://www.w3.org/Protocols/ HTTP/AsImplemented.html

[24] “Http f¨orfr˚agningar,” accessed: 2017-04-28. [Online]. Available: http://www. tutorialspoint.com/http/http requests

[25] “Index vs type,” accessed: 2017-05-06. [Online]. Available: https://www.elastic. co/blog/index-vs-type

[26] “Jmeter,” accessed: 2017-05-11. [Online]. Available: http://jmeter.apache.org/ [27] “Json elasticsearch,” accessed: 2017-05-30. [Online]. Available:

https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-object-type. html#mapping-object-type

[28] “Lucene,” accessed: 2017-04-22. [Online]. Available: https://lucene.apache.org/ core/

[29] “Mapping,” accessed: 2017-05-10. [Online]. Available: https://www.elastic.co/ guide/en/elasticsearch/reference/current/mapping.html

(40)

Referenser

[30] “Match,” accessed: 2017-05-11. [Online]. Available: https://www.elastic.co/guide/ en/elasticsearch/reference/current/query-dsl-match-query.html

[31] “Matsmart,” accessed: 2017-05-10. [Online]. Available: http://www.matsmart.se/ [32] “Microsoft internet explorer,” accessed: 2017-05-15. [Online]. Available:

https://www.microsoft.com/sv-se/download/internet-explorer.aspx

[33] “Multi match query,” accessed: 2017-05-13. [Onli-ne]. Available: https://www.elastic.co/guide/en/elasticsearch/reference/current/ query-dsl-multi-match-query.html

[34] “Nodejs,” accessed: 2017-04-28. [Online]. Available: https://nodejs.org/en/ [35] “Om systembolaget,” accessed: 2017-04-02. [Online]. Available: https://www.

systembolaget.se/om-systembolaget/om-foretaget/korta-fakta/

[36] “React,” accessed: 2017-04-28. [Online]. Available: https://facebook.github.io/ react/

[37] “React componets,” accessed: 2017-04-28. [Online]. Available: https://facebook. github.io/react/docs/components-and-props.html

[38] “Restful,” accessed: 2017-05-06. [Online]. Available: https://en.wikipedia.org/ wiki/Representational state transfer

[39] “search-personalization-user-experience,” accessed: 2017-04-09. [On-line]. Available: https://searchenginewatch.com/sew/opinion/2118126/ search-personalization-user-experience

[40] “similarweb, website ranking,” accessed: 2017-04-02. [Online]. Available: https://www.similarweb.com/website/systembolaget.se#overview

[41] “Solr,” accessed: 2017-05-10. [Online]. Available: http://lucene.apache.org/solr/ [42] “solr vs elasticsearch,” accessed: 2017-04-22. [Online]. Available: https://www.

searchtechnologies.com/blog/solr-vs-elasticsearch-top-open-source-search [43] “Solr vs elasticsearch,” accessed: 2017-04-22. [Online]. Available: https:

//logz.io/blog/solr-vs-elasticsearch/

[44] “Standard analyzer,” accessed: 2017-05-14. [Online]. Avai-lable: https://www.elastic.co/guide/en/elasticsearch/reference/current/ analysis-standard-analyzer.html

(41)

Referenser

[45] “Stop token filter,” accessed: 2017-05-15. [Online]. Available: https://www. elastic.co/guide/en/elasticsearch/reference/current/analysis-stop-tokenfilter.html [46] “Systembolaget, s¨alja med ansvar,” accessed:

2017-04-02. [Online]. Available: https://www.systembolaget.se/vart-uppdrag/ salja-med-ansvar-sa-jobbar-vi-pa-systembolaget/

[47] “Virtual dom,” accessed: 2017-05-30. [Online]. Available: https://www. accelebrate.com/blog/the-real-benefits-of-the-virtual-dom-in-react-js/

[48] “What is a search engine?” accessed: 2017-04-23. [Online]. Available: http://www.webopedia.com/TERM/S/search engine.html

[49] “What is an index,” accessed: 2017-05-06. [Online]. Available: https://www. elastic.co/blog/what-is-an-elasticsearch-index

[50] “What is relevance?” accessed: 2017-06-01. [Online]. Available: https://www. elastic.co/guide/en/elasticsearch/guide/current/relevance-intro.html

[51] “Dell.com,” 2016, accessed: 2017-04-02. [Online]. Available: https://www.elastic. co/use-cases/dell-com

[52] “Http access control (cors),” 2017, accessed: 2017-04-02. [Online]. Available: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access control CORS [53] A. Accomazzo, A. Lerner, N. Murray, C. Allsopp, D. Gutman, and T. McGinnis,

Fullstack React The complete guide to ReactJS and friends. San Francisco, Ca-lifornia, USA: Fullstack.io, 2017.

[54] R. Kuc and M. Rogizinksi, Elasticsearch Server, 2nd ed. Birmingham, UK: Packt Publishing, 2014.

[55] J. Vanderzyden, “What is elasticsearch,” 2016, accessed: 2017-04-02. [Online]. Available: https://qbox.io/blog/what-is-elasticsearch

References

Related documents

ENERGIKONTOR SYDOST AB är en regional kraft och vägvisare till ett hållbart energi- och transportsystem.. Vårt mål är minskad klimatpåverkan och ökad regional utveckling

Varf¨ or l¨ agger vi s˚ a mycket tid p˚ a att hitta l¨ osningar och s¨ att att ber¨ akna deter- minanter d˚ a, jo f¨ or determinanter anv¨ ands t.ex. f¨ or att

Det som ¨ar likt mellan prototypen fr˚an 2019 och portalen som vi har skapat ¨ar att anv¨andaren kan s¨oka r¨att p˚a kurser och kurstillf¨allen, f¨or att sedan se

F¨ or att ¨ oka anv¨ andbarheten b¨ or de funktioner som anv¨ ands oftast vara de enklaste att komma ˚ at och genomf¨ ora. Detta kan implementeras genom att de mest anv¨

Detta g¨aller alla tal vars dyadiska utveckling ¨ar ¨andlig; man beh¨over inte kasta fler kast ¨an vad som anges av den position d¨ar sista ettan finns i utvecklingen.. Det betyder

Endast definitioner och trigonometriska r¨ aknelagar f˚ ar anv¨ andas utan att de f¨ orst bevisas. Sida 2

Ett annat s¨att att unders¨oka om f ¨ar en r¨orelsekonstant ¨ar att f¨ors¨oka hitta en transformation under vilken problemet ¨ar invariant och sedan anv¨anda Noethers teorem

Vid genomf¨ orandet av laborationen fanns laborationsassistenter p˚ a plats f¨ or att besvara fr˚ agor, men inte f¨ or att st¨ alla fr˚ agor. Laborationen ¨ ar en utveckling av