3) Søge-gui'en (i asp eller php)
Når du søger på et ord, skal du indlæse ordfilen der svarer til søgeordet ('abekat': indlæs a.txt, 'borebisser': indlæs b.txt etc.)
Herefter finder du linien hvor ordet forekommer i tekstfilen:
abekat/12,34/56,78
.. og splitter dataerne ad:
result = split(linie, "/")
result(0) = ord
result(1) = side-id'er
result(2) = positioner
result(1) indeholder nu en streng '12,34' - den splitter du igen på ',' - det samme med result(2).
Sorter positionerne, så den laveste position er først (husk at sortere side-id'erne også, så de matcher positionerne) - og du er nu klar til at præsentere resultaterne.
Først indlæser du siden med links een gang for alle. Herefter kan du for hvert sideid i Result(2) hente sidens data og udskrive disse.
Ovenstående er ret nemt lavet. Problemerne kommer først når der er mere end eet ord i søgestrengen: så skal du lave to søgninger og merge dataerne sammen bagefter - og tage højde for om det er OR eller AND søgning.
Der er desuden et par elementer jeg ikke har beskrevet her. De er ikke så vigtige på en sitesearch, men du skal vide at der er begrænsninger:
1) Crawleren tager ikke højde for Robots.txt - det bør (skal) den gøre hvis du slipper crawleren løs i "det fri". (robots.txt er en fil man kan lægge på sin server for f.eks. at blokkere for bestemte sider eller directories).
2) Indexeren kender ikke til "stopord". Jeg har implementeret STOPORD (ord der forekommer på X procent af alle sider - men indexerings- og søgealgoritmen er lidt tricky at forklare kort her :-)
3) Indexeren kender ikke til "frase-søgning" (dvs. søgning på 'michael jackson' (to ord der skal stå efter hinanden). Problemet ligger i indexeren, der kun indexerer et ord én gang per side.
... det var lidt at komme igang med - start med crawleren, det (synes jeg) er det mest logiske - og den nemmeste opgave (synes jeg).
Du kan iøvrigt se søgegui'en i aktion på
http://beta.kimschumacher.dk - her er crawler + indexer lagt som et cronjob på serveren, der kører én gang i døgnet og opdaterer søgeindexet.