Strukturerad data
fakta om en sida, skrivna för maskiner
Vad det är
Ett företags kontaktsida säger i en mening var kontoret ligger. Strukturerad
data säger samma sak en gång till, som en PostalAddress med gatuadress,
postnummer och land, så att ett program som läser sidan slipper gissa vilket ord
som är orten. Det är bruket att upprepa det som en sida säger i löptext som
typade påståenden i ett ordförråd som utgivare och läsande program är överens
om, så att sökmotorer och annan mjukvara kan läsa fakta utan att tolka layouten.
Ordet behandlas som en mängd och inte som något räknebart, och i bestämd form
heter det den strukturerade datan.
Ordförrådet är oftast schema.org, som enligt Googles dokumentation är det
ordförråd som merparten av den strukturerade datan för Googles sökning bygger
på. Google, Microsoft, Yahoo och Yandex grundade det, och sedan april 2015 är en
gemenskapsgrupp (community group) inom W3C dess huvudsakliga forum. Det
definierar typer, som Organization, Person, Service, Review eller
DefinedTerm, och de egenskaper som varje typ kan bära, som name, address,
author eller price.
Påståendena kan skrivas i tre syntaxer. Microdata och RDFa lägger attribut
direkt på de synliga HTML-elementen. JSON-LD håller påståendena åtskilda, som
ett block JSON i ett script-element av typen application/ld+json, och är i
version 1.1 en W3C-rekommendation, publicerad den 16 juli 2020. Google godtar
alla tre som likvärdiga och rekommenderar JSON-LD som den som är lättast att
underhålla i stor skala.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Ltd",
"url": "https://example.com/"
}
</script>
Den viktigaste raden i blocket är @id. JSON-LD använder den för att
identifiera en nod, och en nod utan identifierare är en så kallad blank node,
som ingenting utanför det egna blocket kan peka på. Med en identifierare kan
vilket annat block som helst, på vilken annan sida som helst, skriva
"publisher": {"@id": "https://example.com/#organization"}, vilket
specifikationen kallar en nodreferens (node reference): en pekare till något som
beskrivs på annat håll, i stället för en ny beskrivning av det. Det är
identifierarna som gör en spridd samling block till en enda graf.
Närmaste grannterm är metadata. Titeln, beskrivningen och Open Graph-taggarna i
sidans head beskriver sidan som dokument, medan strukturerad data beskriver
det som sidan handlar om: företaget bakom den, personen som skrev den, tjänsten
den erbjuder eller ordet den definierar.
Varför det spelar roll
Beslutet gäller hur mycket som ska sägas, och det ärliga svaret är oftast mindre än ordförrådet tillåter, men komplett. Ingenting i syntaxen hindrar en utgivare från att fylla i varje egenskap som schema.org erbjuder. Googles egna riktlinjer pekar åt andra hållet: ange färre rekommenderade egenskaper, kompletta och korrekta, hellre än alla tänkbara med ofullständiga eller felaktiga uppgifter, och märk inte upp något som en läsare inte kan se på sidan, inte ens när det är sant.
Skälet är att varje uppmärkt faktum är en andra kopia av något som sidan redan säger, och en andra kopia kan glida isär från originalet. Ett pris som ändrats i den synliga tabellen men glömts i JSON-blocket, ett betyg som bara maskiner ser, en adress som skrivits lite olika på varje sida: var och en får sidan att säga en sak till människor och en annan till program. Kostnaden för strukturerad data ligger mindre i att skriva den än i att hålla den sann, så de användbara frågorna är vilka påståenden sidan kan stå för och om de kommer från samma källa som den synliga texten.
Vinsten är läsbarhet för maskiner. En sökmotor eller en agent som kan foga samman hundra omnämnanden till ett enda företag vet mer än en som läser hundra namn utan samband. Sidor som följer riktlinjerna kan bli berättigade till utökade resultat (rich results), sökträffar med extra detaljer, men att vara berättigad garanterar inga sådana. Det som förändras är hur väl en maskin förstår vad sidan handlar om.
Så ser det ut i praktiken
Webbplatsens kolofon lovar att bara märka upp det som är sant och synligt på sidan, och historiken bakom webbplatsens strukturerade data visar varför den meningen behövde skrivas ned.
Före omarbetningen
beskrev 963 block företaget 1 671 gånger, utan en enda stabil identifierare,
så ingen som läste datan hade grund för att behandla organisationen på en sida
som organisationen på en annan. Grafen vilar nu på tre identifierare som skapas
utifrån webbplatsens ursprung, en för organisationen, en för webbplatsen och en
för grundaren, och varje annat block refererar till dem med @id i stället för
att beskriva dem igen. Identifierarna är desamma på alla språk: en kommentar i
mallen förklarar att en separat dansk identifierare skulle deklarera en andra
organisation med samma CVR-nummer. Sexton typer används, och listor nämner sina
poster enbart med URL, eftersom det skulle ha gjort den komprimerade indexsidan
för portföljen 52 % tyngre att skriva ut alla 107 poster.
Flera fakta läses från samma källa som den synliga sidan. Tjänstepriserna kommer
från samma datafil som priserna på skärmen, så en maskin och en läsare får samma
pris. Perioden som ett arbete omfattar kommer från den partial som skriver
meningen om det. Brödsmulorna följer den synliga stigen, och positionerna i
listor följer ordningen på skärmen, aldrig en rangordning som bara publiceras
för maskiner. Sidans egen nod använder samma adress som sidan anger som kanonisk URL, så att märkningen och sidans head gör ett och samma påstående.
Det som lämnas bort är lika avsiktligt som det som sägs. Företagets egna
beskrivningar av sitt arbete märks inte upp som recensioner, eftersom det skulle
hitta på en författare till dess egna ord. Rekommendationer från namngivna
personer märks upp, men utan betyg, eftersom ingen har gett något. Varje sida i
ordlistan, den här inräknad, bär en DefinedTerm vars beskrivning är den
enradiga förklaringen som visas i listan, så att definitionen en maskin läser är
densamma som en läsare ser.
En kontroll över den byggda webbplatsen säkerställer att varje block går att tolka, att varje identifierare går att slå upp och att varje URL som grafen nämner faktiskt byggdes, så en graf som pekar på en sida som inte finns stoppas i kvalitetsgrinden. Samma kolofon listar Schema Markup Validator för att läsa datan och Googles Rich Results Test för att se vad en sökmotor gör med den.
Var det går fel
Sidan visas som en vanlig sökträff trots att varje validator godkänner den. Märkningen är giltig JSON-LD och använder riktiga typer från schema.org, men sidan fortsätter att dyka upp utan extra detaljer. Datan beskriver sådant som en läsare inte kan se, som ett betyg som ingen har gett, frågor som är dolda på sidan eller ett pris som skiljer sig från det på skärmen, och Google varnar för att märkning som bryter mot riktlinjerna kan göra att en sida inte är berättigad till utökade resultat, hur ren syntaxen än är. Märk bara upp det som sidan visar, och generera båda från en källa så att de inte kan glida isär.
Hundratals block beskriver ett och samma företag, och inget fogar samman
dem. Varje sida upprepar organisationens namn, logotyp och adress, ibland med
små skillnader, och att rätta en detalj innebär att leta upp alla. Noderna är
anonyma, eller så skapar varje sida och varje språk sin egen identifierare för
samma sak. Ge varje verklig sak ett @id byggt av en stabil URL med ett
fragment, beskriv den en gång och referera till den överallt annars.
En ändring i en mall förstör märkningen på alla sidor på en gång. Ett
citattecken på fel ställe, ett avslutande kommatecken eller ett tomt värde gör
varje block ogiltigt, och ingen som läser datan kan använda något av den.
Googles guide varnar för att mallar kan förstöra märkningen efter en
driftsättning. JSON-blocket sattes ihop som text, med värden inklistrade mellan
klammerparenteser, så ett fält som saknas lämnar en tom sträng eller en trasig
struktur. Bygg påståendet som en datastruktur och serialisera det, som den här
webbplatsens mallar gör med Hugos jsonify, utelämna egenskaper som saknar
värde i stället för att skriva ut dem tomma, och tolka varje block i det byggda
resultatet.
Grafen nämner sidor som inte finns. URL:erna i märkningen leder till en 404-sida, en testmiljö eller en speglad kopia. Adresserna skrevs för hand eller byggdes efter en annan regel än länkarna och den kanoniska adressen. Härled varje URL i märkningen från samma funktion som tar fram sidans kanoniska adress, och kontrollera att var och en byggdes.
Läs mer
- schema.org — det gemensamma ordförrådet av typer och egenskaper, med en sida för varje typ.
- JSON-LD 1.1 — W3C-rekommendationen för syntaxen, med nodidentifierare och nodreferenser.
- schema.org: DefinedTerm — typen som varje sida i ordlistan använder för att beskriva ordet den förklarar.
- Google Search Central: introduction to structured data — de tre syntaxerna, regeln om synlighet och hur utökade resultat testas.
- Schema Markup Validator — läser den strukturerade datan på vilken sida som helst mot ordförrådet i schema.org.