Intelligente suggesties, deel 1: Introductie en 'StartsWith'
This post was originally published on Coding Glamour.
Dit is deel 1 in een serie over de techniek uit een 'intelligente' zoekbox.
- 1. Introductie en 'StartsWith'
- 2. Volledige matching en typfouten
- 3. Uitspraak en hierarchie
- 4. Aantallen, caching en Protocol Buffers
Doelen
- Tonen van suggesties op basis van de input van de gebruiker
- Suggesties kunnen zowel geheel matchen ('Amsterdam'), of gedeeltelijk ('Amste')
- Hierarchie moet ondersteunt worden ('Amsterdam, Noord-Holland'; 'Wibautstraat, Amsterdam')
- Het aantal woningen dient naast de suggestie getoond te worden
- Tolerant in invoer ('Köog a/d Zaan' moet 'Koog aan de Zaan' als suggestie geven)
- Op basis van uitspraak gebieden vinden die hetzelfde klinken ('Wiboudstraat' en 'Wibautstraat')
- Tolerantie voor typfouten ('Utrect')
- Omdraaien van de opdracht ('Amsterdam, Pijp' wordt 'Pijp, Amsterdam')
Normaliseren van namen en zoekacties
Voor we data uit de database gaan halen, is het van belang om alle namen te normaliseren. Denk hierbij aan het strippen van spaties en diakrieten, en het gebruik van synoniemen.
Model
Voor het opslaan van de verschillende gebieden maken we gebruik van GIS-data die we aankopen. Tijdens de eerste run trekken we dit uit de database en slaan we dit op in een in-memory lijst. Van elk gebied hebben we nodig:
Speciaal geval hierboven is de array van 'Keys'. Dit zijn alle zoektermen waarop gezocht kan worden en waarin dit gebied terug moet komen. Denk hierbij bij 'Den Haag' aan 'denhaag' en 'haag'. De reden dat we dit doen is omdat je altijd een StartsWith wil doen en geen Substring, omdat dat niet te indexen valt.
Gebieden vinden (StartsWith)!
Gebieden vinden we op basis van hun Keys. Wanneer een bezoeker 'Amste' intypt willen we alle gebieden vinden die een key hebben die begint met 'amste'. Voor dit doel hebben we een index nodig; maar die is niet zo makkelijk te leggen. Daarom kies ik er hier voor om de index op de eerste twee karakters te leggen. Dit doen we voor elk element in de 'Keys' array.
We kunnen hierdoor al snel 99,8% van alle mogelijkheden schrappen door alleen te kijken naar de eerste twee karakters. Er zitten per key zo'n 600 entiteiten onder en die zijn in een duizendste van een seconde te doorzoeken.
Morgen dieper de algoritmes in om efficiënt gebieden te vinden waarbij de input volledig matcht, en op typfouten.
There are 10 comments on this article, read them on Coding Glamour.