Nonsensresultat från "Stop Lookup"?
Jag försöker använda Stop Lookup för att, ja, slå upp hållplatser. Här är ett exempel där jag lönlöst försöker söka efter hållplatser som innehåller texten "danderyd":
https://journeyplanner.integration.sl.se/v2/stop-finder?name_sf=danderyd&type_sf=any&any_obj_filter_sf=2
På denna "sökning" får jag resultat där *inte en enda* av hållplatsernas namn innehåller söktermen (!) "Östberga"...? "Stocksund"...? "Solgården"...? Vad är detta? Försök hitta ett enda omnämnande av söktermen "danderyd" i fältet "disassembledName" – jag lyckas då inte.
Som ni kan se så skickar jag med "any_obj_filter_sf=2" som säger att jag vill söka enbart inom hållplatser. På vilket sätt är detta ett "stop lookup", dvs. ett hållplatssök? Den söker ju uppenbarligen inte i hållplatsnamnen. Alternativt sorteras inte resultaten, och då blir ett sökresultat som klipps av efter totalt 13 objekt helt oanvändbart.
Här är svarsdatan jag fick:
{ "locations": [ { "coord": [ 59.405925, 18.073439 ], "disassembledName": "Östberga", "id": "9091001000009684", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Östberga", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4, 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009684" }, "type": "stop" }, { "coord": [ 59.389947, 18.091064 ], "disassembledName": "Ekudden (Djursholm)", "id": "9091001000000962", "isBest": false, "isGlobalId": true, "matchQuality": 953, "name": "Danderyd, Ekudden (Djursholm)", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 9 ], "properties": { "mainLocality": "Danderyd", "stopId": "18000966" }, "type": "stop" }, { "coord": [ 59.409317, 18.072451 ], "disassembledName": "Altorp", "id": "9091001000009683", "isBest": true, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Altorp", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009683" }, "type": "stop" }, { "coord": [ 59.385098, 18.04392 ], "disassembledName": "Stocksund", "id": "9091001000009639", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Stocksund", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009639" }, "type": "stop" }, { "coord": [ 59.392252, 18.046813 ], "disassembledName": "Mörby", "id": "9091001000009638", "isBest": false, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Mörby", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4, 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009638" }, "type": "stop" }, { "coord": [ 59.425812, 18.05143 ], "disassembledName": "Enebyberg", "id": "9091001000009634", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Enebyberg", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009634" }, "type": "stop" }, { "coord": [ 59.418656, 18.007601 ], "disassembledName": "Sätra", "id": "9091001000002164", "isBest": false, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Sätra", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002164" }, "type": "stop" }, { "coord": [ 59.407992, 18.02519 ], "disassembledName": "Solgården", "id": "9091001000002154", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Solgården", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002154" }, "type": "stop" }, { "coord": [ 59.410456, 18.017599 ], "disassembledName": "Ridvägen", "id": "9091001000002153", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Ridvägen", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "properties": { "mainLocality": "Danderyd", "stopId": "18002153" }, "type": "stop" }, { "coord": [ 59.41355, 18.003478 ], "disassembledName": "Torsplan", "id": "9091001000002151", "isBest": false, "isGlobalId": true, "matchQuality": 950, "name": "Danderyd, Torsplan", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002151" }, "type": "stop" }, { "coord": [ 59.409944, 18.010377 ], "disassembledName": "Skogsvik", "id": "9091001000002147", "isBest": false, "isGlobalId": true, "matchQuality": 950, "name": "Danderyd, Skogsvik", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002147" }, "type": "stop" }, { "coord": [ 59.405358, 18.006415 ], "disassembledName": "Borgen", "id": "9091001000002144", "isBest": false, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Borgen", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002144" }, "type": "stop" }, { "coord": [ 59.401609, 18.011437 ], "disassembledName": "Ekbacken", "id": "9091001000002143", "isBest": false, "isGlobalId": true, "matchQuality": 950, "name": "Danderyd, Ekbacken", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002143" }, "type": "stop" } ], "systemMessages": [ { "code": -8011, "module": "BROKER", "text": "", "type": "error" } ] }
https://journeyplanner.integration.sl.se/v2/stop-finder?name_sf=danderyd&type_sf=any&any_obj_filter_sf=2
På denna "sökning" får jag resultat där *inte en enda* av hållplatsernas namn innehåller söktermen (!) "Östberga"...? "Stocksund"...? "Solgården"...? Vad är detta? Försök hitta ett enda omnämnande av söktermen "danderyd" i fältet "disassembledName" – jag lyckas då inte.
Som ni kan se så skickar jag med "any_obj_filter_sf=2" som säger att jag vill söka enbart inom hållplatser. På vilket sätt är detta ett "stop lookup", dvs. ett hållplatssök? Den söker ju uppenbarligen inte i hållplatsnamnen. Alternativt sorteras inte resultaten, och då blir ett sökresultat som klipps av efter totalt 13 objekt helt oanvändbart.
Här är svarsdatan jag fick:
{ "locations": [ { "coord": [ 59.405925, 18.073439 ], "disassembledName": "Östberga", "id": "9091001000009684", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Östberga", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4, 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009684" }, "type": "stop" }, { "coord": [ 59.389947, 18.091064 ], "disassembledName": "Ekudden (Djursholm)", "id": "9091001000000962", "isBest": false, "isGlobalId": true, "matchQuality": 953, "name": "Danderyd, Ekudden (Djursholm)", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 9 ], "properties": { "mainLocality": "Danderyd", "stopId": "18000966" }, "type": "stop" }, { "coord": [ 59.409317, 18.072451 ], "disassembledName": "Altorp", "id": "9091001000009683", "isBest": true, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Altorp", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009683" }, "type": "stop" }, { "coord": [ 59.385098, 18.04392 ], "disassembledName": "Stocksund", "id": "9091001000009639", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Stocksund", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009639" }, "type": "stop" }, { "coord": [ 59.392252, 18.046813 ], "disassembledName": "Mörby", "id": "9091001000009638", "isBest": false, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Mörby", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4, 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009638" }, "type": "stop" }, { "coord": [ 59.425812, 18.05143 ], "disassembledName": "Enebyberg", "id": "9091001000009634", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Enebyberg", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 4 ], "properties": { "mainLocality": "Danderyd", "stopId": "18009634" }, "type": "stop" }, { "coord": [ 59.418656, 18.007601 ], "disassembledName": "Sätra", "id": "9091001000002164", "isBest": false, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Sätra", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002164" }, "type": "stop" }, { "coord": [ 59.407992, 18.02519 ], "disassembledName": "Solgården", "id": "9091001000002154", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Solgården", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002154" }, "type": "stop" }, { "coord": [ 59.410456, 18.017599 ], "disassembledName": "Ridvägen", "id": "9091001000002153", "isBest": false, "isGlobalId": true, "matchQuality": 948, "name": "Danderyd, Ridvägen", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "properties": { "mainLocality": "Danderyd", "stopId": "18002153" }, "type": "stop" }, { "coord": [ 59.41355, 18.003478 ], "disassembledName": "Torsplan", "id": "9091001000002151", "isBest": false, "isGlobalId": true, "matchQuality": 950, "name": "Danderyd, Torsplan", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002151" }, "type": "stop" }, { "coord": [ 59.409944, 18.010377 ], "disassembledName": "Skogsvik", "id": "9091001000002147", "isBest": false, "isGlobalId": true, "matchQuality": 950, "name": "Danderyd, Skogsvik", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002147" }, "type": "stop" }, { "coord": [ 59.405358, 18.006415 ], "disassembledName": "Borgen", "id": "9091001000002144", "isBest": false, "isGlobalId": true, "matchQuality": 955, "name": "Danderyd, Borgen", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002144" }, "type": "stop" }, { "coord": [ 59.401609, 18.011437 ], "disassembledName": "Ekbacken", "id": "9091001000002143", "isBest": false, "isGlobalId": true, "matchQuality": 950, "name": "Danderyd, Ekbacken", "parent": { "id": "placeID:33001062:1", "name": "Danderyd", "type": "locality" }, "productClasses": [ 5 ], "properties": { "mainLocality": "Danderyd", "stopId": "18002143" }, "type": "stop" } ], "systemMessages": [ { "code": -8011, "module": "BROKER", "text": "", "type": "error" } ] }
Följ inlägget
1
följare
Hej,

Jag vet inte exakt hur sökalgoritmen ser ut men du får ju liknande resultat på SLs hemsida. Alla hållplatser du får upp ligger i Danderyds kommun och fullständiga namnet innehåller Danderyd (på liknande sätt som i bilden nedan), och vad jag vet så finns det ingen hållplats som heter endast Danderyd. Om du lägger till ett 's' i din sökning (danderyds) gissar jag att du får resultat som är mer likt det du är ute efter..
Mvh
Sofie
När det gäller hållplatssökning finns det många olika sätt att gå tillväga, och olika sätt att välja vilka hållplatser som ska visas högst upp. I ditt exempelhar SL till exempel valt att leta genom fullständiga visningsnamn, där "Danderyd, Östberga" är ett väldigt bra match för "Danderyd" eftersom visningsnamnet börjar med söksträngen, som desutom har en parent som heter exakt Danderyd. Denna strategi ger typiskt bra resultat, men inte för fall som dessa där man söker på ett platsnamn som finns med i visningsnamnet för väldigt många hållplatser.
Samtidigt som att man kan förbättra detta, är detta API även det som ligger bakom SLs egna tjänster. Det vill säga att man inte kan ändra saker för att optimera API-resultatet, utan API:et returnerar svaren hur SL vill visa upp dem.
Är man missnöjd med platssupsslag API:er, något som jag själv ofta brukar vara eftersom bara nätverkstrafiken redan tillför en påtaglig fördröjning när man vill implementera en autocomplete, kan man implementera en egen lokal platsuppslag baserat på listan med hållplatserna. På detta sätt kan man själv bestämma över exakt vilka fält som ska användas för att leta fram hållplatser, och i vilken ordning de ska presenteras. På detta sätt kan man till exempel välja att alltid visa den mest trafikerade hållplatsen högst upp, och ordna resultat utefter om söksträngen finns i början eller mitt i platsnamnet. Alla sites finns till exempel i SL Transport API:et, och vill man koppla dessa med trafik kan man koppla site.stop_areas i SL Transport till stops.txt i GTFS Regional för SL. På sikt kan vi även undersöka om vi kan exportera sites i GTFS Regional.
Hälsningar,
Bert
Tack för tipsen och förslagen. Hållplatssök är dock för närvarande inget jag är intresserad av att implementera.
Jag har nu i alla fall frågat var jag bäst felanmälan detta.
Jag får intrycket av att ni inte (?) vidarebefordrar felanmälningen till SL, vilket är förvirrande då jag trodde trafiklab var gränssnittet mellan api-användare och dataleverantörer (SL). Det känns också som att ni gör det tydligt att ni själva inte är SL genom att understryka att det är SL som beslutar om hur deras sök ska fungera, samtidigt som ni väljer (?) att bryta feedbackloopen mellan SL och deras api-användare. Kombinera detta med det faktum att 1) SL själva har valt att erbjuda APIet till oss användare, och 2) SL själva har valt att använda samma API till sina tjänster. Att använda dessa beslut som ett skäl att inte vidarebefordra återkoppling känns märkligt – det är ju inte som att jag inte blivit erbjuden att använda APIet, och att mitt användande därmed inte redan finns med i ekvationen.
Återigen, jag kan visa denna sökning för 20 personer på gatan och ingen kommer reagera med "vad bra att ingen av hållplatsnamnen innehåller ordet jag faktiskt skrev". Varför skulle SL vara mer nöjda med ett sånt betyg än tredjepartsanvändare av samma Api?
"Samtidigt som att man kan förbättra detta, är detta API även det som ligger bakom SLs egna tjänster. Det vill säga att man inte kan ändra saker för att optimera API-resultatet, utan API:et returnerar svaren hur SL vill visa upp dem."
Denna filosofi förbättrar varken sökresultaten för SLs egna tjänster eller för användarna av API:erna, så ni kommer förmodligen inte lyckas värva mig till denna "låt oss förbättra ingetdera"-inställning till felrapportering. Jag trodde att dessa Api var till för att ge ett bra resultat för slutanvändare – inte vara en datavetenskaplig övning där jag säger "algoritmen ger dåligt slutresultat" och ni kontrar med "resultatet är korrekt om man bara accepterar hur algoritmen funkar".
Resultatet blir inte bättre bara för att man visar upp dem på SLs officiella hemsida eller app, vilket era skärmbilder så tydligt visar. Det är fortfarande dåliga resultat på en uppenbar sökterm för en stor knutpunkt. Jag tycker det är märkligt att avfärda det med "tekniskt sett korrekt" – ja, det förstår jag, men de är både tekniskt korrekta och dåliga på samma gång. Själv föredrar jag att bidra till en bättre sök för alla användare än att sitta i tystnad och uppfinna samma hjul på nytt.
Då jag har fått uppfattningen att ni inte vidarebefordrar detta så får jag kontakta dem på annan väg. Själv hade jag gissat att det var självklart att utnyttja synergin i att andra Api-användare också synar datan, till att förbättra resultaten för alla 🤷♂️ men ni gör som ni vill.
Hör gärna av er med hur ni väljer att göra.