Een zoekmachine bouwen #1 - De eerste opzet

10 januari 2018

Jaren geleden heb ik een zoekmachine gebouwd en ben ik begonnen aan een paper die geheel toegewijd is aan dit onderwerp. De zoekmachine is nooit helemaal af geworden en hetzelfde geldt voor de paper. Een laatste concept komt uit 2011 (!) en is enigszins verouderd. Veel basisideeën zijn nog hetzelfde, maar er is een aantal zaken veranderd:

  • Social media is groter dan ooit en moet meegenomen worden
  • PHP is als taal dichter bij een "echte" programmeertaal gekomen
  • De hardware is gigantisch verbeterd
  • Mijn budget is groter dan toen

Het crawlen gebeurt in redelijk basale vorm:

  • Er wordt (nog) geen rekening gehouden met robots.txt
  • Sitemap wordt niet uitgelezen
  • Startpunt vanuit 2 pagina's: startpagina.nl en startkabel.nl
  • In eerste instantie alleen domeinpagina's indexeren (dus wel http://edwindijk.nl maar niet http://edwindijk.nl/pagina)
  • Een extract opslaan van de pagina

Een fout in het oorspronkelijke ontwerp van de zoekmachine was dat alles direct verwerkt werd in plaats van opgeslagen. Dit gaf weinig mogelijkheden om het algoritme aan te passen, omdat dit betekende dat alles opnieuw geindexeerd moest worden. Een lokale kopie opslaan behoorde niet tot de mogelijkheden, omdat hier een gebrek aan schijfruimte voor was.

Inmiddels is, zoals gezegd, de hardware verbeterd. Dat wil ook zeggen dat ik voor relatief weinig geld meer data kan opslaan. Een lokale kopie van elke pagina is vooral nuttig bij het testen van de algoritmes. Het opnieuw opbouwen van de index kan dan in een halfuur gebeurd zijn, in plaats van 2 a 3 dagen.

Op dit moment sla ik geen lokale kopie van de hele pagina op, maar een extract van de pagina. Dit bestaat uit een array die gevuld is met arrays per element. Op basis van de semantische structuur van de pagina kan een basisscore worden bepaald. Denk aan de headings, bold text, meta description en de title.

Dat wil zeggen dat het volgende in de database wordt opgeslagen. Een willekeurig voorbeeld:

 

Array
(
    [base] => 
    [title] => Array
        (
            [0] => Kinderspul
        )

    [h1] => Array
        (
        )

    [h2] => Array
        (
            [0] => Nooit uitgespeeld met de houten puzzel
            [1] => Dagboekschrijven tijdens de vakantie
            [2] => Persoonlijk en speciaal: een zelf bedrukt T-shirt voor de allerkleinsten
            [3] => Kindertassen
            [4] => Veel kinderen houdt je langer jong
            [5] => Baby eet bacon en…vindt het fantastisch!
            [6] => Mannetje weigert babybroertje terug te geven…
            [7] => De inzet van CliniClowns niet alleen bedoeld voor afleiding en plezier
            [8] => Ja joh, leg vooral een nieuw babybroertje onder de kerstboom…
            [9] => Dochtertje Trijntje Oosterhuis heet Maël Joni Ronde
            [10] => Tekort aan pleegouders noopt tot onorthodoxe zoekmethoden
            [11] => Nieuw van Tumble ‘N Dry Tumble ‘N Dry Zero voor de allerkleinsten
            [12] => Handboek over de huid van kinderen, 0 – 4 jaar
            [13] => Nieuwe collectie Done by Deer: grafische lifestyle voor baby’s en peuters
            [14] => Sinterklaas en mini-pony’s in Hermitage Amsterdam
            [15] => Rubrieken
        )

    [h3] => Array
        (
            [0] => Menu
            [1] => Meer Berichten
            [2] => Facebook
            [3] => Recente Reacties
            [4] => Aanbiedingen
            [5] => Overzicht van blogs
            [6] => Links
        )

    [h4] => Array
        (
        )

    [h5] => Array
        (
            [0] => Kinderspul
        )

    [b] => Array
        (
        )

    [strong] => Array
        (
        )

    [i] => Array
        (
        )

    [em] => Array
        (
        )

    [u] => Array
        (
        )

    [inboundLinks] => Array
        (
        )

    [outboundLinks] => Array
        (
            [0] => http://kinderspul.blog.nl
            [2] => http://kinderspul.blog.nl/het-beste-kinderspul/2016/06/20/nooit-uitgespeeld-met-de-houten-puzzel
            [3] => http://kinderspul.blog.nl/het-beste-kinderspul
            [5] => http://kinderspul.blog.nl/het-beste-kinderspul/2016/06/17/dagboekschrijven-tijdens-de-vakantie
            [8] => http://kinderspul.blog.nl/het-beste-kinderspul/2016/05/25/persoonlijk-en-speciaal-een-zelf-bedrukt-t-shirt-voor-de-allerkleinsten
            [11] => http://kinderspul.blog.nl/het-beste-kinderspul/2016/03/29/kindertassen
            [14] => http://kinderspul.blog.nl/opmerkelijk/2016/01/13/veel-kinderen-houdt-je-langer-jong
            [15] => http://kinderspul.blog.nl/opmerkelijk
            [17] => http://kinderspul.blog.nl/kinderfilmpjes/2015/12/30/baby-eet-bacon-en-vindt-het-fantastisch
            [18] => http://kinderspul.blog.nl/kinderfilmpjes
            [20] => http://kinderspul.blog.nl/kinderfilmpjes/2015/12/30/mannetje-weigert-babybroertje-terug-te-geven
            [23] => http://kinderspul.blog.nl/goed-kinderdoel/2015/12/24/de-inzet-van-cliniclowns-niet-alleen-bedoeld-voor-afleiding-en-plezier
            [24] => http://kinderspul.blog.nl/goed-kinderdoel
            [26] => http://kinderspul.blog.nl/kinderfilmpjes/2015/12/09/ja-joh-leg-vooral-een-nieuw-babybroertje-onder-de-kerstboom
            [29] => http://kinderspul.blog.nl/kinderen-van-celebs/2015/12/09/dochtertje-trijntje-oosterhuis-heet-mael-joni-ronde
            [30] => http://kinderspul.blog.nl/kinderen-van-celebs
            [32] => http://kinderspul.blog.nl/nieuws/2015/12/08/tekort-aan-pleegouders-noopt-tot-onorthodoxe-zoekmethoden
            [33] => http://kinderspul.blog.nl/nieuws
            [35] => http://kinderspul.blog.nl/het-beste-kinderspul/2015/12/08/nieuw-van-tumble-n-dry-tumble-n-dry-zero-voor-de-allerkleinsten
            [36] => http://kinderspul.blog.nl/gezondheid/2015/11/30/handboek-over-de-huid-van-kinderen-0-4-jaar
            [37] => http://kinderspul.blog.nl/het-beste-kinderspul/2015/11/30/nieuwe-collectie-done-by-deer-grafische-lifestyle-voor-babys-en-peuters
            [38] => http://kinderspul.blog.nl/uit-met-je-kids/2015/11/24/sinterklaas-en-mini-ponys-in-hermitage-amsterdam
            [39] => http://kinderspul.blog.nl/page/2
            [40] => http://kinderspul.blog.nl/page/3
            [41] => http://kinderspul.blog.nl/page/427
            [52] => http://kinderspul.blog.nl/negen-maanden-zwanger/2010/02/14/online-vragen-stellen-over-zwanger-zijn-en-direct-advies-krijgen#comment-137334
            [54] => http://kinderspul.blog.nl/verhalen-uit-de-praktijk/2010/02/16/help-mijn-zoon-wil-een-waveboard-advies#comment-137333
            [56] => http://kinderspul.blog.nl/nieuws/2010/08/18/het-telefoonnnummer-van-justin-bieber#comment-137331
            [58] => http://kinderspul.blog.nl/kinderfilmpjes/2015/12/30/mannetje-weigert-babybroertje-terug-te-geven#comment-137330
            [60] => http://kinderspul.blog.nl/kinderfilmpjes/2015/12/09/ja-joh-leg-vooral-een-nieuw-babybroertje-onder-de-kerstboom#comment-137329
            [62] => http://kinderspul.blog.nl/nieuws/2007/09/29/jarenlang-dragen-van-lui-oog-sticker-waanzin#comment-137328
            [64] => http://kinderspul.blog.nl/gezondheid/2014/05/16/osteopathen-adviseren-niet-teveel-snoep-tijdens-schoolreisjes#comment-137326
            [66] => http://kinderspul.blog.nl/televisie/2010/07/18/meedoen-met-kinderen-voor-kinderen#comment-137325
            [68] => http://kinderspul.blog.nl/televisie/2010/07/18/meedoen-met-kinderen-voor-kinderen#comment-137324
            [70] => http://kliks.affiliate4you.nl/6849/2161/5788/?linkinfo=banner-kinderspul
            [71] => http://alternative.blog.nl
            [72] => http://games.blog.nl
            [73] => http://kinderboeken.blog.nl
            [74] => http://nlpop.blog.nl
            [75] => http://videoclips.blog.nl
            [76] => http://amstelveen.blog.nl
            [77] => http://eropuit.blog.nl
            [78] => http://hotel.blog.nl
            [79] => http://travel.blog.nl
            [80] => http://zeeland.blog.nl
            [81] => http://auto.blog.nl
            [82] => http://bier.blog.nl
            [83] => http://fitness.blog.nl
            [84] => http://gay.blog.nl
            [85] => http://schaatsen.blog.nl
            [86] => http://seks.blog.nl
            [87] => http://wereldnieuws.blog.nl
            [88] => http://wielrennen.blog.nl
            [89] => http://beauty.blog.nl
            [90] => http://fashion.blog.nl
            [91] => http://glamour.blog.nl
            [92] => http://relatie.blog.nl
            [93] => http://zappen.blog.nl
            [94] => http://besparen.blog.nl
            [95] => http://circus.blog.nl
            [96] => http://dieet.blog.nl
            [97] => http://dieren.blog.nl
            [98] => http://fotografie.blog.nl
            [99] => http://gezondheid.blog.nl
            [100] => http://koffie.blog.nl
            [101] => http://koken.blog.nl
            [102] => http://kunst.blog.nl
            [103] => http://musical.blog.nl
            [104] => http://paranormaal.blog.nl
            [105] => http://spiritualiteit.blog.nl
            [106] => http://thee.blog.nl
            [107] => http://wonen.blog.nl
            [108] => http://hemaverzekeringen.blog.nl
            [109] => http://huizenmarkt.blog.nl
            [110] => http://hypotheken.blog.nl
            [111] => http://mijngeld.blog.nl
            [112] => http://politiek.blog.nl
            [113] => http://powervrouwen.blog.nl
            [114] => http://reclamewereld.blog.nl
            [115] => http://socialmedia.blog.nl
            [116] => http://blog.nl
            [117] => http://kinderspul.blog.nl/advertorial
            [118] => http://kinderspul.blog.nl/autoreviews
            [119] => http://kinderspul.blog.nl/babys
            [120] => http://kinderspul.blog.nl/basisschoolleeftijd
            [121] => http://kinderspul.blog.nl/colofon
            [122] => http://kinderspul.blog.nl/de-leukste-kinderboeken
            [123] => http://kinderspul.blog.nl/door-de-ogen-van-een-vader
            [124] => http://kinderspul.blog.nl/gezondheid
            [129] => http://kinderspul.blog.nl/kleuters
            [130] => http://kinderspul.blog.nl/lieve-kids-mooie-fotos
            [131] => http://kinderspul.blog.nl/mail-kinderspulblognl
            [132] => http://kinderspul.blog.nl/negen-maanden-zwanger
            [135] => http://kinderspul.blog.nl/papas-en-mamas
            [136] => http://kinderspul.blog.nl/peuters
            [137] => http://kinderspul.blog.nl/prijsvragen
            [138] => http://kinderspul.blog.nl/productreviews
            [139] => http://kinderspul.blog.nl/pubers
            [140] => http://kinderspul.blog.nl/speelgoed
            [141] => http://kinderspul.blog.nl/surfen-met-of-zonder-kids
            [142] => http://kinderspul.blog.nl/televisie
            [143] => http://kinderspul.blog.nl/uit-met-je-kids
            [144] => http://kinderspul.blog.nl/verhalen-uit-de-praktijk
            [145] => http://kinderspul.blog.nl/wie-maakt-kinderspulblognl
            [147] => http://blogonline.blog.nl/over-blognl
            [148] => http://images.blog.nl/docs/gebruiksvoorwaardenmrt09.pdf
            [149] => http://blog.nl/klachtenformulier
            [150] => http://images.blog.nl/docs/privacyverklaringmrt09.pdf
            [151] => http://blog.nl/adverteren
        )

)

Er wordt in principe onderscheid gemaakt tussen inbound en outbound links. Zoals in het voorbeeld te zien is, gebeurt dit nog niet helemaal goed. Ook moet ik zeggen dat ik de outbound links van deze blog, gezien het onderwerp, nogal twijfelachtig vind. Met name seks.blog.nl lijkt me ietwat ongepast. Een goed startpunt voor een filter ;-)

Op basis van de gegevens die in de array staan, kan ik het algoritme ontwikkelen en verfijnen. Het streven is een redelijk goede selectie op basis van content, waarna additionele factoren toegevoegd kunnen worden zoals aantal inkomende links maar ook het aantal uitgaande links.

Op dit moment is het aantal geindexeerde pagina's 16,943 en het aantal links dat in de database staat 406,951. De zoekmachine draait pas net, dus niks aan het handje.

10,000 geindexeerde pagina's nemen ~60MiB in beslag. Dat wil zeggen dat 1 miljoen pagina's ongeveer 6GiB kost. Uitgaande van wat Google indexeert, ca. 20 tot 30 miljard pagina's, gaat dit minimaal 120.000GiB aan data opleveren. Dat lijkt me enigszins overdreven voor een hobbyproject, dus ik ga er vanuit dat er ca. 50 miljoen pagina's als maximum in kunnen. Later kan er dan een filter ontwikkeld worden om de beste content eruit te filteren en de rest te verwijderen uit de index.

Eerstvolgende zaken om op te pakken:

  • 301-redirects volgen
  • 404-meldingen registreren
  • Inbound/outbound links beter afvangen
  • Links naar diepere pagina's in de website wel registreren, maar prioriteit geven aan volledige domeinnamen. M.a.w. pas diepere pagina's indexeren als de kale domeinnamen allemaal verwerkt zijn.

Dus... werk aan de winkel!

Tweet deze blog:


Of Like hem op Facebook!

Twitter


 

Internet Marketing

Een zoekmachine bouwen #7 - Backlinks & Tabellen
Geplaatst op 22 juli 2018

Een zoekmachine bouwen #6 - Full page cache
Geplaatst op 13 juli 2018

Een zoekmachine bouwen #5 - Een stap verder
Geplaatst op 11 juli 2018

Een zoekmachine bouwen #4 - Server upgrade
Geplaatst op 10 juli 2018

Auteur:

 

TimeTick producten
Urenregistratie software
Gratis urenregistratie software