Kako se pokazalo – gotovo sve. Upravo je zato biblija.hr postala koristan poligon za niz problema koji se javljaju na svakom velikom sadržajnom projektu, samo što su ovdje bolje vidljivi jer ih ništa drugo ne zaklanja.
Ovo je zapis tehničkih odluka i pogrešaka. Pogreške ne uljepšavamo, jer su one korisnija polovica priče.
stihova, svaki s vlastitom stranicom
stihova obrađenih i pregledanih dnevno
Što je zapravo projekt
Biblija.hr je portal za proučavanje Biblije na hrvatskom jeziku. Uz svaki stih dolazi grčki ili hebrejski izvorni tekst, transliteracija, doslovni prijevod, gramatička analiza riječ po riječ i kratki teološki sažetak.
Ideja je skromna: da obitelj ili mala skupina može kod kuće otvoriti Pismo i uz sebe imati ono što je inače dostupno samo onima koji su studirali biblijske jezike.
Platforma je nopCommerce 4.8 na SQL bazi iza nginxa. Izvor za Novi zavjet je SBL Greek New Testament, a za Stari zavjet Westminster Leningrad Codex s morfologijom iz projekta Open Scriptures Hebrew Bible. Sav sadržaj objavljen je pod licencom CC BY-SA 4.0. Urednički je rad volonterski, a stranica je besplatna. Nas je zanimao inženjerski dio.
Licence dolaze prije koda
Kod Biblije to je manje očito nego što zvuči. Izvorni tekst je drevan, ali svaki je suvremeni prijevod zasebno zaštićeno djelo. Prevoditelj ima autorsko pravo kao autor izvornog djela, a ono traje sedamdeset godina nakon njegove smrti.
Isto vrijedi i za izvorne tekstove. Grčki Novi zavjet nije jedan tekst, nego niz kritičkih izdanja. Nestle–Aland pripada svom izdavaču i ne smije se slobodno objavljivati, a SBL izdanje dostupno je pod Creative Commons licencom. Razlika je jedan redak konfiguracije i golema razlika u pravnoj izloženosti.
Pouka koja vrijedi i drugdje: kad ulazni podaci nisu vaši, popis izvora i njihovih licenci prvi je dokument projekta, a ne posljednji.
Navođenje izvora je tehnički zahtjev, a ne fusnota
Kod otvorenih licenci lako je navođenje izvora shvatiti kao nešto što živi u podnožju stranice. Nije tako. Obveza vrijedi svugdje gdje sadržaj napušta sustav:
- na stranici, kao vidljiv element
- u XML i JSON izvozima, kao polje u zaglavlju dokumenta
- u PDF-ovima za ispis, u podnožju svake stranice
- u funkciji „kopiraj stih”, unutar samog kopiranog teksta
Ovo posljednje svi propuste. Korisnik kopira stih, zalijepi ga u prezentaciju i navod izvora nestane. Tehnički, to je kršenje licence koje je omogućio vaš vlastiti sustav.
Navođenje mora biti i uvjetno. Navesti grčki izvor ispod starozavjetnog odlomka nije samo suvišno, nego pogrešno. Pola retka koda, ali to je razlika između pažljivog i nemarnog. I pripada modulu koji prikazuje sadržaj, nikad temi: zamijenite temu i navod izvora tiho nestane.
Opseg mijenja pravila
Cache prestaje biti optimizacija. Kad se svaka stranica generira dinamički i nosi sigurnosni token, ne može se spremiti u cache. Kod dvjesto stranica to je nebitno. Kod trideset tisuća vrijeme odziva izravno određuje koliko URL-ova crawler obiđe u danu. Rješenje je odvojiti anonimni dio stranice, koji je statičan, od dijela vezanog uz korisnika, koji se može dohvatiti naknadno.
Težina stranice množi se brojem stranica. Na našim je stranicama ista analiza bila u HTML-u tri puta – jednom prikazana, dvaput unutar JavaScript objekta koji koristi sučelje. Na jednoj stranici to nitko ne primijeti. Na trideset tisuća to je trostruki promet i trostruki trošak indeksiranja.
Sitemap se ne generira na svaki zahtjev. Naš je običan bash skript koji čita iz SQL-a, slaže XML i atomski ga premješta u web root. Tri detalja koja je lako pogriješiti:
- upit vraća jedan red po retku XML-a, jer
COPYu tekstualnom formatu escapea nove retke unutar vrijednosti UNION ALLne jamči redoslijed, paORDER BYmora biti u samom upitu za izvoz – inače XML deklaracija može završiti usred datoteke- piše se pod privremenim imenom pa se preimenuje;
mvunutar istog datotečnog sustava je atoman, pa crawler nikad ne dohvati napola zapisanu datoteku
Ne pripada sve u sitemap. Stranica bez vlastitog sadržaja ne treba zasebno indeksiranje. Naš sitemap sadrži svako poglavlje, ali samo one stihove koji već imaju gotovu analizu; ostali imaju canonical na svoje poglavlje. I dalje su dostupni čitateljima, ali više ne opterećuju indeks.
Najskuplja pogreška: dvije domene
Školski problem, a ipak se dogodio.
Stranica je odgovarala i na golu domenu i na poddomenu www, bez preusmjeravanja između njih. Za protokole su to dva različita imena, a tražilica ih nije dužna povezati – www je tehnički poddomena kao i svaka druga.
Posljedica: svaka od 31.000 stranica postojala je u dvije verzije. Signali rangiranja su se podijelili, a crawl budget trošio se dvaput na isti sadržaj.
Još gore, tri signala nisu se slagala. Canonical je pokazivao na www, sitemap je bio objavljen na goloj domeni, a preusmjeravanja nije bilo. Crawler je dobio tri proturječne upute i odlučio sam.
Rješenje je bilo dosadno i trostruko: 301 u nginxu, jedan kanonski oblik adrese i sitemap na istom hostu. Jedan detalj vrijedi zapamtiti: HTTP preusmjeravanje treba ići izravno na konačnu adresu, a ne prvo na HTTPS pa onda na kanonski host. Automatski generirane konfiguracije to redovito rade u dva skoka.
Srodna zamka: u nopCommerceu canonical postoji kao mehanizam, ali se automatski ispisuje samo na nekim vrstama stranica. Sve ostalo ga mora dodati. Završili smo s canonicalom na stranicama stihova, a bez njega na naslovnici – najgora moguća podjela, jer naslovnica skuplja sve dolazne poveznice koje postoje.
Što su podaci stvarno pokazali
Kad je sve bilo posloženo, izvještaji su dali jedan doista neočekivan rezultat.
Očekivali smo da će kvaliteta stranica biti usko grlo: trideset tisuća zapisa iste strukture jako nalikuje strojno generiranom sadržaju. Pokazalo se suprotno – nula stranica u redu za otkrivanje i samo pet obiđenih pa odbijenih. Sadržaj prolazi.
Pogriješili smo i oko dubine. Crawler je pronašao i indeksirao stotine stranica prije nego što je sitemap uopće obrađen, uključujući stihove do kojih kroz sučelje treba desetke klikova. Pretpostavka da dubina navigacije koči indeksiranje nije preživjela susret s podacima.
Na putu su zapravo bile tehničke stvari: podijeljena domena, siromašni naslovi stranica i nedostatak stranice koja okuplja cijelo poglavlje na jednom mjestu.
Što se prenosi na druge projekte
Tema je neobična. Problemi nisu. Isti obrazac vrijedi za kataloge proizvoda, arhive dokumenata, pravne baze – sve što ima desetke tisuća sličnih zapisa.
Licence
Popis izvora, uvjeta i obveznih navoda prvi je dokument. S tuđim sadržajem to nije formalnost.
Navod izvora u sustavu
Uz svaki izlaz, uvjetno prema izvoru, u modulu, a ne u temi. Ne redak u podnožju.
Jedna kanonska adresa
Preusmjeravanje, canonical i sitemap moraju govoriti isto. Dva od tri nije dovoljno.
Ne indeksira se sve
Zapis bez vlastitog sadržaja treba ostati dostupan korisnicima, ali s canonicalom na nadređenu stranicu.
Automatizacija na razini datoteka
Generiraj, spremi, premjesti atomski. Sitemap koji se računa na svaki zahtjev je bug koji se pokaže tek pod opterećenjem.
Alati predlažu, ljudi odlučuju
Jezični modeli su kod ovog opsega neizbježni, ali svaki objavljeni redak prošao je ljudski pregled – i stranica to otvoreno kaže.
Ta posljednja točka zaslužuje vlastitu rečenicu. Transparentnost metode nije marketing. Ona je preduvjet povjerenja, osobito kad je riječ o sadržaju od kojeg ljudi očekuju točnost.
Biblija se pokazala zahvalnom temom upravo zato što je zahtjevna: velika, strogo strukturirana, na tri jezika, pravno zamršena i čitana od publike koja primijeti svaku pogrešku.
