Airport Search — Interactive Test Page

Kunden-Simulation

Voraussetzung: Standortfreigabe im Betriebssystem (Ortungsdienste) und im Browser für diese Seite.
Suche gerade nicht verfügbar – bitte erneut tippen
Keine Flughäfen gefunden
Voraussetzung: Standortfreigabe im Betriebssystem (Ortungsdienste) und im Browser für diese Seite.
Suche gerade nicht verfügbar – bitte erneut tippen
Keine Flughäfen gefunden
Experten-Testbereich (alle Parameter)
A — Suche
Testfälle:
B — Parameter

Ranking-Details pro Ergebnis anzeigen

C — Filter

JetApp Airport Search — Feature-Beschreibung & Testszenarien

Zielgruppe: Marketing-Team, QA, Produktmanagement
Stand: Oktober 2026 | Endpunkt: GET /api/v2/airports/search


Feature-Beschreibung

Die JetApp Airport Search ist eine Echtzeit-Flughafensuche für alle Buchungsformulare und Touchpoints im Frontend. Sie löst die bisherige Legacy-Suche ab (der Legacy-Endpunkt ist deprecated, Abschaltung zum 30.06.2027) und liefert im Schnitt < 50 ms Antwortzeiten — auch bei komplexen Anfragen mit Tippfehlern, fremdsprachigen Eingaben oder Regionalbezeichnungen.


Highlights auf einen Blick

Feature Details
⚡ Blitzschnell < 50 ms Antwortzeit durch Meilisearch-Index (kein DB-Hit zur Laufzeit)
🌍 9 Sprachen Deutsch, Englisch, Französisch, Italienisch, Spanisch, Polnisch, Chinesisch, Arabisch, Russisch
✏️ Tippfehler-tolerant Ab 4 Zeichen: 1 Tippfehler erlaubt; ab 8 Zeichen: 2 Tippfehler erlaubt
🗺️ Geo-Fallback Kein Flughafen für den Suchbegriff? → Nächstgelegene Airports per Entfernungs-Decay-Ranking (Radius 150 km um den Treffer bzw. Ort)
🏷️ Spitznamen & Umgangssprache „Malle", „Gstaad", „Lake Como" → korrekte Flughäfen
🧭 Teilbegriffe bei Reisezielen Ab 3 Zeichen: „French Rivi" → French Riviera, „Sardini" → Sardinien; vollständige Namen haben immer Vorrang
🛫 Kuratierte Alternativen Feste, sinnvolle Weiterreise-Plätze: München → Oberpfaffenhofen, Mailand → Linate/Malpensa/Bergamo, EuroAirport → Freiburg, Palma → Son Bonet; Hinweis: keine Eignungszusage für jedes Flugzeug
🏝️ Inselregel Andere Inseln gelten nicht als normale Umgebungsalternative (Palma zeigt kein Ibiza, Nizza kein Korsika)
⚖️ Mehrdeutige Begriffe Bei Kollisionen (z. B. „Sylt" = Westerland vs. Code SYLT/Lethem) steht der für Charterkunden relevante Flughafen zuerst, die zweite Bedeutung bleibt wählbar
🔤 Synonyme „Cologne" = „Köln" = „Koeln" = „CGN" = „EDDK"
🌐 Multi-Channel Länderspezifische Vorschläge je Channel (DE, AT, CH, FR, IT, GB, ES)
📍 Koordinaten-Suche Nächstgelegene Flughäfen via lat/lng-Parameter
📊 Relevanz-Ranking Priorisierung nach Startbahnlänge, Buchungsfrequenz, Is-Top-Flag
🔄 Zero-Downtime-Import Wöchentlicher Datenupdate ohne Suchunterbrechung

Unterstützte Sucharten

1. Freitextsuche (Name, Stadt, Land)

Nutzer tippt einen beliebigen Namen — in jeder der 9 Sprachen — und bekommt passende Flughäfen zurück.

Beispiele:

  • Munich → EDDM (Munich International Airport)
  • Monaco → LNMC (Monaco Héliport) oder LFMN (Nice Côte d'Azur)
  • Londra (Italienisch für London) → EGLL, EGKK, EGLC
  • 科隆 (Chinesisch für Köln) → EDDK (Cologne Bonn Airport)

2. IATA- und ICAO-Code-Suche

Exakte Übereinstimmung wird höchstpriorisiert durch das Meilisearch-Ranking (attribute-Regel vor sort).

Beispiele:

  • MUC → EDDM
  • EDDK → Cologne Bonn Airport
  • LHR → London Heathrow
  • CDG → Paris Charles de Gaulle

3. Umgangssprachliche Namen & Spitznamen

Kuratierte Liste von Nicknamen pro Flughafen (data/airport_nicknames.json) + Meilisearch-Synonyme.

Beispiele:

  • Malle → LEPA (Palma de Mallorca)
  • Heathrow → EGLL (London Heathrow)
  • Gatwick → EGKK (London Gatwick)
  • Schönefeld → EDDB (Berlin Brandenburg)
  • Tegel → EDDB (Tegel ist Synonym für Berlin, wird auf BER umgeleitet)

4. Regional- und Gebietssuche (Geo-Fallback)

Wenn kein direkter Flughafen gefunden wird, sucht das System im places-Index (Städte, Regionen, Inseln, Seen, Gebirge, Tourismusregionen) und gibt die nächstgelegenen Airports zurück. Bei mehreren gleich guten Orts-Treffern gewinnt der bekanntere (Einwohnerzahl, Wikipedia-Verbreitung), bei Gleichstand der Ort im Land des Channels. Das Feld context ({name, type}; nearCity bleibt als Alias) ist dann im Response gesetzt.

Zusätzlich gilt: Trifft die Eingabe exakt den Namen eines Gewässers, einer Küste oder Insel (See, Küste, Insel), hat das Gebiet Vorrang vor Flughafen-Treffern – „Bodensee" liefert Flughäfen rund um den See (Friedrichshafen, St. Gallen-Altenrhein, Memmingen, Zürich) statt nur des Flughafens, der „Bodensee" im Namen trägt. Wird ein Flughafen nur über Synonym/Alias gefunden („Wittenberg" → Leipzig/Halle), bleiben die Treffer gleich, context benennt aber den gemeinten Ort. Dadurch kann das Frontend häufiger eine Überschrift wie „Flughäfen in der Nähe von …" zeigen.

Die Airports werden innerhalb eines 150-km-Radius nach einem kombinierten Score aus Relevanz und Entfernung gerankt:

  • Nahe Airports werden deutlich bevorzugt (Orts-Anker: Decay 15 km)
  • Populäre aber weit entfernte Großflughäfen werden nach hinten gereiht
  • Beispiel: „Wittenberg" → Leipzig/Halle (57 km) erscheint vor Berlin (80 km)

Beispiele:

  • Schwarzwald → EDTL (Schwarzwald/Lahr), EDSB (Karlsruhe/Baden-Baden)
  • Dolomiten → LIPB (Bozen), LOWI (Innsbruck)
  • Toskana / Tuscany → LIRQ (Florenz), LIRP (Pisa), LIQS (Siena)
  • Lake Garda → LIPX (Verona), LIPO (Brescia)
  • French Riviera → LFMN (Nice Côte d'Azur)
  • Côte d'Azur → LFMN (Nice Côte d'Azur)

5. Ländername-Suche

Ländernamen in den 9 Sprachen werden erkannt (symfony/intl) und liefern die Top-Flughäfen des Landes, sortiert nach Relevanz.

Beispiele:

  • Germany / Deutschland / Allemagne / Germania → Top-Flughäfen in Deutschland
  • Italy / Italien / Italie → Top-Flughäfen in Italien
  • Spain / Spanien / Espagne → Top-Flughäfen in Spanien

6. Leere Suche / Top-Airports

Ohne Suchbegriff werden die Top-Airports nach Relevanz-Score zurückgegeben — channelspezifisch gefiltert.

Beispiele (Channel: jetappde):

  • Leere Anfrage → Top-Airports in Deutschland (EDDF, EDDM, EDDB, EDDK)

Beispiele (Channel: default / en_US):

  • Leere Anfrage → Global Top-Airports (EGLL, LFPG, EDDF, EHAM, ...)

7. Koordinaten-basierte Suche

Mit lat/lng-Parametern werden die nächstgelegenen Flughäfen nach Luftlinien-Distanz sortiert zurückgegeben. Das Feld distanceKm ist im Response gesetzt.

Beispiel:

  • lat=48.137154&lng=11.576124 (Marienplatz München) → EDDM (28 km), EDMA (60 km), ...

Response-Felder

Feld Beschreibung Beispiel
id ICAO-Code EDDM
iataCode IATA-Code MUC
icaoCode ICAO-Code EDDM
name Lokalisierter Flughafenname München Franz Josef Strauß
city Lokalisierter Stadtname München
country Lokalisierter Ländername Deutschland
countryCode ISO-3166-1-Alpha-2-Ländercode DE
regionName Lokalisierter Regionsname Bayern
regionCode ISO-3166-2-Regionscode DE-BY
lat / lng Koordinaten des Flughafens 48.3538 / 11.7861
continent Kontinentcode EU
isTop Kuratierter Top-Flughafen true
type Flughafentyp large_airport
scheduledService Linienflugbetrieb true
endonym Einheimischer Name (nur wenn abweichend) Flughafen München
cityEndonym Einheimischer Stadtname (nur wenn abweichend) München
distanceKm Entfernung in km (nur bei Geo-Suche) 28.4
nearCity Geo-Fallback-Stadt (nur bei Regions-/Ortssuche; Alias von context.name) Freiburg im Breisgau
context Ort/Gebiet, auf das sich die Liste bezieht: {name, type} mit type = city, region, tourist_region, coast, lake, island, mountain_range {"name": "Bodensee", "type": "lake"}
matchType direct = Treffer über Name/Stadt/Destination/Code/kuratierte Pins; nearby = Alternativ-Flughafen in der Umgebung (im Frontend unter eigener Überschrift, 5 sichtbar, Rest ausklappbar) direct
usage Nutzungsart: civil, military, heliport, seaplane. Militärflugplätze werden als „Militärflugplatz – Nutzung auf Anfrage“ gekennzeichnet civil
countries Länder, die der Flughafen bedient (inkl. Nachbarland, z. B. LFSB → Frankreich/Schweiz) [{"code":"CH","name":"Schweiz"}]
destination Vermarktetes Reiseziel, falls abweichend von der Stadt (Anzeige „{destination} / {city}“), sonst null St. Moritz (LSZS)
debug Nur bei debug=true: Score-Komponenten, Formel, Meilisearch-Ranking –

API-Parameter

Parameter Pflicht Beschreibung Beispiel
q Nein Suchbegriff; leer = Top-Airports Munich
l Nein Locale (Sprache, bei leerem q auch Länderfilter). Fallback: Header Accept-Language, sonst en_US de_DE, en, fr
channel Nein JetApp-Channel-Code (Länderfilter bei leerem q). Fallback: Header X-Channel, dann aus Locale abgeleitet. Unbekannter Channel = kein Filter jetappde, default
lat / lng Nein Koordinaten für Geo-Suche (nur gültig, wenn beide gesetzt, lat −90…90, lng −180…180; sonst ignoriert) 48.14 / 11.58
limit Nein Max. direkte Treffer (Standard: 10, min. 1, max. 50). Zusätzlich werden bis zu 10 nearby-Treffer angehängt (nur ab 10 % des besten Umgebungs-Scores, nie aufgefüllt) 10
region Nein ISO-3166-2-Filter (Format XX-YYY, ungültig = ignoriert); gilt auch für die Umgebungssuche DE-BW
type Nein Flughafentyp-Whitelist (ungültige Werte werden verworfen). Standard: Groß-/Mittelflughäfen plus alle im Legacy-System aktiven Flughäfen plus Whitelist; ein expliziter Wert überschreibt den Standard (ohne Legacy-/Whitelist-Ergänzung) large_airport,medium_airport
debug Nein true = Score-Details je Treffer true

Hinweis Standard-Suche: Sichtbar sind large_airport, medium_airport, alle im Legacy-System aktiven Flughäfen (in_legacy_db, z. B. LFTZ) sowie die Einträge aus data/airport_whitelist.json (z. B. LNMC, LECC, LESB). Weitere Erweiterungen (Avinode-Whitelist als Quelle, small_airport mit Linienverkehr oder Mindest-Startbahnlänge) sind in Evaluierung. Heliports/Wasserflugplätze außerhalb von Legacy/Whitelist sind nur per explizitem type abrufbar. Ein Score-Override beeinflusst nur das Ranking, nicht die Sichtbarkeit.


Channels & Länder-Vorfilterung

Bei leerem Suchbegriff werden Ergebnisse nach dem aktiven Channel auf das jeweilige Land gefiltert:

Channel Locale Länderfilter
default en_US / en Kein Filter (global)
jetappde de_DE / de 🇩🇪 Deutschland
jetappat de_AT 🇦🇹 Österreich
jetappch de_CH 🇨🇭 Schweiz
jetappch_fr fr_CH 🇨🇭 Schweiz
jetappch_it it_CH 🇨🇭 Schweiz
jetappfr fr_FR / fr 🇫🇷 Frankreich
jetappit it_IT / it 🇮🇹 Italien
jetappcouk en_GB 🇬🇧 Großbritannien
jetappes es_ES / es 🇪🇸 Spanien

Relevanz-Ranking

Die Reihenfolge der Suchergebnisse basiert auf einem mehrstufigen Relevanz-Score:

Score = ((Startbahn-Score × Regionskoeffizient × IsTop-Koeffizient) + (Buchungsfrequenz × 10)) × Typ-Koeffizient
Faktor Werte
Startbahn-Score > 3000 m = 100 · > 2000 m = 60 · > 1200 m = 30 · > 600 m = 10 · sonst = 2
Regionskoeffizient Europa ×3 · Nordamerika ×2 · Asien/Ozeanien ×1,5 · Rest ×1
Is-Top-Koeffizient Als Top markiert ×5 · sonst ×1
Buchungsfrequenz Anzahl JetApp-Buchungen ab/zu diesem Airport
Typ-Koeffizient Großflughafen/Mittel/Klein ×1,0 · Heliport ×0,5 · Wasserflugplatz ×0,3 · Sonstige ×0,7

Manuelle Overrides möglich über data/airport_score_overrides.json.

Umgebungssuche (Anker + Fill) — gilt bei jeder Text-Suche mit Treffer, bei Ortssuchen ohne Airport und bei reiner Standortsuche:
Der beste Treffer (Airport, Ort oder kuratierter Name wie „Gstaad“) ist der Anker und steht an erster Stelle. Die restlichen Plätze werden mit Flughäfen im Umkreis von 150 km aufgefüllt. Ihr Score wird mit einem Entfernungs-Decay-Faktor gewichtet:

Score = relevance_score × e^(−Entfernung_m / 40 000)
        × 1,5 (Flughafen im Land des Ankers)
        × 0,4 (kleine Flugplätze/Heliports ohne Linienverkehr)

Bei 40 km beträgt der Decay-Faktor ~37 %. Kleine Flugplätze werden abgewertet, aber nie ausgeschlossen. Länder- und Regionsnamen („Deutschland“, „Bayern“) bleiben reine Gebietssuchen ohne Umgebungs-Fill.


Weitere Regeln & Ausnahmen

  • Reihenfolge der Auflösung (Text-Suche): (1) kuratierter Spitzname/Pin aus place_nicknames.json → (2) Ländername → (3) Flughafen-Volltext → (4) Orts-Treffer aus dem places-Index mit Umgebungssuche → (5) Fallback mit niedriger Konfidenz (nie leer, wenn es Treffer gab). Länder-/Regionsnamen sind reine Gebietssuchen ohne Umgebungs-Fill.
  • Ländernamen-Ausnahme: Länder mit weniger als 3 passenden Flughäfen (z. B. „Monaco“) werden als normale Suche behandelt. „Spain“ liefert Spanien, nicht „Port of Spain“.
  • Kuratierte Reihenfolgen: Einzelne Städte haben feste Hauptflughäfen (Paris → LFPG, Rom → LIRF, London → EGLL, Istanbul → LTFM). Spitznamen mit exclusive erhalten keinen Umgebungs-Fill. Alternative Schreibweisen (z. B. „Comer See“, „Lac de Côme“) liefern dieselbe Reihenfolge wie „Lake Como“.
  • Direkte vs. Umgebungs-Treffer: Weitere direkte Treffer müssen Score ≥ 0,55 haben und ≤ 150 km vom Anker entfernt sein. Mittlere/große Zivilflughäfen innerhalb 80 km vom Anker werden immer in die Umgebungsliste übernommen (z. B. Freiburg → Lahr, Donaueschingen, Straßburg).
  • Kleine Flugplätze: Liegen außerhalb des Standard-Typfilters. Gibt es keinen sicheren Treffer, werden small_airport-Treffer per Name/Stadt/Code vorangestellt („Saanen“ → LSGK vor Sion/Bern).
  • Gebiets-Vorrang: Exakter Gewässer-/Küsten-/Inselname schlägt Flughafen-Treffer („Bodensee“). Ausnahme: Der Suchbegriff ist exakt der IATA-/ICAO-Code des Top-Treffers; „Zürich“ bleibt Flughafen-Suche (See „Zürichsee“ ist kein exakter Treffer).
  • Synonym-/Alias-Treffer: Flughäfen bleiben unverändert, context benennt den gemeinten Ort („Wittenberg“ → Leipzig/Halle).
  • Stadtzuordnung: Die Stadt eines Flughafens ist der Ort, nach dem er benannt ist bzw. in dem er liegt – nicht die größte Stadt der Umgebung. Grenzüberschreitende Zuordnung nur für Flughäfen aus airport_served_countries.json.
  • Anzeigenamen: Bevorzugt Override → GeoNames-Name → „Stadt + Zusatz“ (z. B. „Flughafen Mailand-Linate“) → offizieller Name, wenn die Stadt unsicher ist.
  • Militärflugplätze: Nie ausgeschlossen, aber in der Umgebungssuche mit Faktor 0,4 abgewertet; usage=military wird gekennzeichnet.
  • Sichtbarkeit: Ein Score-Override (airport_score_overrides.json) ändert nur das Ranking, nicht die Sichtbarkeit.
  • Stoppwörter: „airport“, „flughafen“, „aéroport“, „aeroporto“, „aeropuerto“, „lotnisko“, „international“ u. ä. werden bei der Suche ignoriert.
  • Fehlerverhalten: Ungültige lat/lng, region oder type werden ignoriert (kein 422). Fällt Meilisearch aus, antwortet eine Text-Suche über die Legacy-DB-Suche (nicht gecacht).
  • Cache: 300 s je Kombination aus Locale, Channel, Suchbegriff, Koordinaten (auf ~1 km gerundet), Limit, Region, Typ und Debug. Header X-Cache: HIT|MISS.

Datenquellen & Update-Zyklus

Quelle Inhalt Update
OurAirports (CSV) Flughafenstammdaten, ICAO/IATA-Codes, Koordinaten, Runways Wöchentlich (Mo 4:00 Uhr)
GeoNames (allCountries) Mehrsprachige Orts-/Regionsnamen Wöchentlich
GeoNames (cities5000) Stadtnamen der Flughäfen Wöchentlich
GeoNames (cities1000, Seen, Gebirge) Places-Index: Orte ≥ 5000 Einw. weltweit, ab 1000 Einw. in DE/AT/CH/FR/MC/LI/IT/ES/GR/HR/PT/PL; bekannte Seen und Gebirge Wöchentlich
Wikidata (SPARQL) Touristische Regionen, Küsten, Seen, Gebirge, Skigebiete, Rivieras, Archipele, Täler (inkl. Bekanntheit über Wikipedia-Sitelinks) Wöchentlich, 7-Tage-Cache
JetApp-DB Buchungsfrequenz, Is-Top-Flags Wöchentlich
airport_nicknames.json Spitznamen, Umgangssprache Manuell (Repo)
airport_synonyms.json Bidirektionale Synonyme Manuell (Repo)
place_nicknames.json Override-Schicht: Slang, feste Flughafenlisten und explizite Reihenfolgen für Hauptflughäfen (z. B. Paris → LFPG) Manuell (Repo)


HTTP-Endpunkt zum Testen

GET /api/v2/airports/search — öffentlich, kein Login/JWT nötig, Antwort: JSON-Array. Alle Parameter siehe API-Parameter. Basis-URL (BASE) je Umgebung, z. B. https://main-bvxea6i-37nw664vivqqa.de-2.platformsh.site oder lokal https://<ddev-projekt>.ddev.site.

Im Browser

BASE/api/v2/airports/search?q=Malle&l=de&channel=jetappde

curl

BASE=https://main-bvxea6i-37nw664vivqqa.de-2.platformsh.site

# Freitext
curl -s -G "$BASE/api/v2/airports/search" --data-urlencode "q=Gstaad" -d l=de -d channel=jetappde

# Top-Airports eines Channels (leeres q)
curl -s -G "$BASE/api/v2/airports/search" -d l=de_AT -d channel=jetappat -d limit=6

# Koordinaten-Suche (Marienplatz München)
curl -s -G "$BASE/api/v2/airports/search" -d lat=48.137154 -d lng=11.576124

# Filter + Debug (Score-Details)
curl -s -G "$BASE/api/v2/airports/search" --data-urlencode "q=Heliport" -d type=heliport -d region=DE-BW -d debug=true

# Locale/Channel per Header statt Parameter, Cache-Status prüfen
curl -s -i -G "$BASE/api/v2/airports/search" --data-urlencode "q=Munich" -H "Accept-Language: en_US" -H "X-Channel: default" | grep -i "^x-cache"

# Kompakte Ausgabe (jq): ICAO, Name, matchType, context
curl -s -G "$BASE/api/v2/airports/search" --data-urlencode "q=Bodensee" -d l=de | jq -r '.[] | [.id, .name, .matchType, (.context.name // "-")] | @tsv'

Sonderzeichen/Leerzeichen im Suchbegriff immer mit --data-urlencode bzw. URL-kodieren (Lake%20Como). Wiederholte Aufrufe kommen 300 s aus dem Cache (X-Cache: HIT); für frische Ergebnisse q, limit oder gerundete Koordinaten variieren.

Parameter-Kurzreferenz

Parameter Typ Standard Gültige Werte / Grenzen
q String leer beliebig; leer = Top-Airports (bzw. Geo-Suche mit lat/lng)
l String Accept-Language, sonst en_US de, de_DE, de_AT, de_CH, fr, fr_CH, it, it_CH, en, en_GB, es, … (Ausgabesprache: de, en, fr, it, es, pl, zh, ar, ru)
channel String X-Channel, sonst aus l default, jetappde, jetappat, jetappch, jetappch_fr, jetappch_it, jetappfr, jetappit, jetappcouk, jetappes
lat, lng Float – −90…90 / −180…180; beide nötig
limit Integer 10 1…50 (Werte außerhalb werden begrenzt)
region String – ISO 3166-2, z. B. DE-BW, ES-CT
type String (CSV) Groß/Mittel + Legacy + Whitelist z. B. large_airport, medium_airport, small_airport, heliport, seaplane_base
debug Boolean false true / false

Beispielantwort (gekürzt)

[
  {
    "id": "EDDM", "iataCode": "MUC", "icaoCode": "EDDM",
    "name": "Flughafen München", "city": "München", "country": "Deutschland", "countryCode": "DE",
    "regionCode": "DE-BY", "lat": 48.3538, "lng": 11.7861,
    "type": "large_airport", "isTop": true, "usage": "civil", "matchType": "direct",
    "distanceKm": null, "context": null
  }
]

Testszenarien

Aufbau: Sucheingabe → Erwartetes Ergebnis | Erstes Ergebnis (ICAO) | nearCity-Feld | Hinweise


Gruppe 1: Flughafen-Direktsuche (Name)

# Eingabe (q) Locale Channel Erwartetes Erstes Ergebnis ICAO Hinweise
1.1 Munich en default Munich Franz Josef Strauss EDDM Englischer Name
1.2 München de jetappde Flughafen München EDDM Deutscher Name
1.3 Monaco en default Monaco Héliport LNMC Kleinster Heliport-Staat
1.4 Zurich en jetappch Zurich Airport LSZH CH-Channel
1.5 Zürich de jetappch Flughafen Zürich LSZH Umlaut im Namen
1.6 Vienna en default Vienna International Airport LOWW Englisch für Wien
1.7 Wien de jetappat Flughafen Wien-Schwechat LOWW Österreichischer Channel
1.8 Paris fr jetappfr Paris Charles de Gaulle LFPG Größter franz. Airport zuerst
1.9 Rome en default Rome Fiumicino LIRF Größter rom. Airport zuerst
1.10 Roma it jetappit Aeroporto di Roma–Fiumicino LIRF Italienische Locale

Gruppe 2: IATA- und ICAO-Code-Suche

# Eingabe (q) Locale Erwartetes Erstes Ergebnis ICAO Hinweise
2.1 MUC de Munich Franz Josef Strauss EDDM IATA → Exakte Priorität
2.2 EDDM de Munich Franz Josef Strauss EDDM ICAO → Exakte Priorität
2.3 LHR en London Heathrow EGLL IATA-Code
2.4 EGLL en London Heathrow EGLL ICAO-Code
2.5 CDG fr Paris Charles de Gaulle LFPG IATA-Code
2.6 CGN de Cologne Bonn Airport EDDK CGN ist Synonym für EDDK
2.7 JFK en John F. Kennedy International KJFK US-Airport per IATA
2.8 DXB en Dubai International OMDB Middle East
2.9 ZRH de Zürich Flughafen LSZH CH-Airport
2.10 ibz es Ibiza Airport LEIB Kleinschreibung muss funktionieren

Gruppe 3: Tippfehler-Toleranz

# Eingabe (q) Erwartetes Erstes Ergebnis ICAO Tippfehler Hinweise
3.1 Munchen Munich Franz Josef Strauss EDDM Fehlendes Umlaut-ü Typo-Toleranz ab 4 Zeichen
3.2 Muenchen Munich Franz Josef Strauss EDDM Umlautschreibung Synonym oder Typo
3.3 Heathrov London Heathrow EGLL v statt w 1 Tippfehler
3.4 Frankfurtt Frankfurt am Main EDDF Doppeltes t 1 Tippfehler
3.5 Amstterdam Amsterdam Schiphol EHAM Doppeltes t 1 Tippfehler
3.6 Barcellona Barcelona El Prat LEBL Doppeltes l (ital. Schreibweise) 1 Tippfehler
3.7 Marseillle Marseille Provence LFML 3 l 1 Tippfehler
3.8 Istanbull Istanbul Airport LTFM Doppeltes l 1 Tippfehler
3.9 Mallorka Palma de Mallorca LEPA k statt c 1 Tippfehler ab 8 Zeichen
3.10 Brüsel Brussels Airport EBBR 1 s fehlt 1 Tippfehler

Gruppe 4: Umgangssprachliche Namen & Spitznamen

# Eingabe (q) Erwartetes Erstes Ergebnis ICAO Quelle
4.1 Malle Palma de Mallorca LEPA airport_nicknames.json + place_nicknames.json
4.2 Mallorca Palma de Mallorca LEPA airport_nicknames.json
4.3 Majorca Palma de Mallorca LEPA airport_nicknames.json (englischer Spitzname)
4.4 Heathrow London Heathrow EGLL airport_nicknames.json
4.5 Gatwick London Gatwick EGKK airport_nicknames.json
4.6 Stansted London Stansted EGSS airport_nicknames.json
4.7 Köln Bonn Cologne Bonn Airport EDDK airport_nicknames.json
4.8 Cologne Bonn Cologne Bonn Airport EDDK airport_nicknames.json
4.9 Schönefeld Berlin Brandenburg EDDB airport_nicknames.json (historisch)
4.10 BER Berlin Brandenburg EDDB IATA-Code / Nickname
4.11 Orly Paris Orly LFPO airport_nicknames.json
4.12 Roissy Paris Charles de Gaulle LFPG Pariser Volksmund
4.13 Marco Polo Venice Marco Polo LIPZ airport_nicknames.json
4.14 Malpensa Milan Malpensa LIMC airport_nicknames.json
4.15 Linate Milan Linate LIML airport_nicknames.json

Gruppe 5: Mehrsprachige Suche

# Eingabe (q) Locale Erwartetes Erstes Ergebnis ICAO Sprache
5.1 Cologne en Cologne Bonn Airport EDDK Englisch für Köln
5.2 Koeln de Cologne Bonn Airport EDDK ASCII-Umschreibung
5.3 Köln de Cologne Bonn Airport EDDK Korrekte Schreibweise
5.4 Colonia it Cologne Bonn Airport EDDK Italienisch für Köln
5.5 Francfort fr Frankfurt am Main EDDF Französisch für Frankfurt
5.6 Francoforte it Frankfurt am Main EDDF Italienisch für Frankfurt
5.7 Londra it London Heathrow EGLL Italienisch für London
5.8 Londres fr London Heathrow EGLL Französisch/Spanisch für London
5.9 Copenhague fr Copenhagen Airport EKCH Französisch für Kopenhagen
5.10 Varsovie fr Warsaw Chopin Airport EPWA Französisch für Warschau
5.11 科隆 zh Cologne Bonn Airport EDDK Chinesisch für Köln
5.12 慕尼黑 zh Munich Franz Josef Strauss EDDM Chinesisch für München
5.13 Мюнхен ru Munich Franz Josef Strauss EDDM Russisch für München
5.14 بارسلونا ar Barcelona El Prat LEBL Arabisch für Barcelona
5.15 Madryt pl Adolfo Suárez Madrid–Barajas LEMD Polnisch für Madrid

Gruppe 6: Städtesuche (Stadt ≠ Flughafen)

# Eingabe (q) Locale Erwartetes Erstes Ergebnis ICAO Hinweise
6.1 Berlin de Berlin Brandenburg EDDB Hauptflughafen der Stadt
6.2 London en London Heathrow EGLL Größter London-Airport zuerst
6.3 New York en John F. Kennedy International KJFK Größter NY-Airport
6.4 Dubai en Dubai International OMDB
6.5 Istanbul tr/en Istanbul Airport LTFM Neuer Airport größer als Sabiha
6.6 Barcelona es Barcelona El Prat LEBL
6.7 Nice fr Nice Côte d'Azur LFMN
6.8 Nizza de Nice Côte d'Azur LFMN Deutsch für Nice
6.9 Genf de Geneva Airport LSGG Deutsch für Genève
6.10 Genève fr Geneva Airport LSGG Französisch für Genf

Gruppe 7: Regionssuche & Geo-Fallback (nearCity gesetzt)

Bei diesen Abfragen wird der Airport-Index (Stufe airport, z. B. Flughafenname enthält „Schwarzwald“), der places-Index (Stufe places) oder place_nicknames.json (Stufe nickname) genutzt.
Das Response-Feld nearCity enthält bei places/nickname den aufgelösten Ortsnamen. Die Tabelle zeigt das Ergebnis des lokalen Laufs von app:search:test (Stand Oktober 2026).

# Eingabe (q) Locale Erstes Ergebnis ICAO Weitere (Top 3) Stufe
7.1 Schwarzwald de Flughafen Schwarzwald (Lahr) EDTL EDSB, EDDS airport
7.2 Black Forest en Black Forest Airport EDTL EDSB, EDDS airport
7.3 Riviera en Villanova Albenga LIMG LNMC, LFMN airport
7.4 French Riviera en Nice Côte d'Azur LFMN LNMC, LFMD airport
7.5 Côte d'Azur fr Nice Côte d'Azur LFMN LNMC, LFMD airport
7.6 Dolomiten de Bozen LIPB LOWI, LIPZ airport
7.7 Dolomites en Bolzano Airport LIPB LOWI, LIPZ places
7.8 Alpen de Zürich LSZH LSZB, LFSB nickname
7.9 Alps en Zurich Airport LSZH LSZB, LSZC nickname
7.10 Toskana de Florenz LIRQ LIRP, LIQS places
7.11 Tuscany en Florence Peretola LIRQ LIRP, LIQS places
7.12 Costa Brava es Girona LEGE LEBL, LFMP airport
7.13 Costa del Sol es Málaga–Costa del Sol LEMG LEZL, LEGR airport
7.14 Pyrenäen de Pau-Pyrénées LFBP LFBT, LFBZ airport
7.15 Bretagne fr Rennes-Saint-Jacques LFRN EGJJ, EGJB nickname
7.16 Normandie fr Deauville – Saint-Gatien LFRG LFRK, LFOH airport
7.17 Südtirol de Bozen LIPB LOWI, LSZS nickname
7.18 South Tyrol en Bolzano Airport LIPB LOWI, LSZS nickname
7.19 Aegean en Athens International LGAV LGMK, LGPA nickname
7.20 Mittelmeer de Catania LICC LICR, LICA nickname
7.21 Lake Garda en Verona Villafranca LIPX LIPO, LIME places

Gruppe 7b: Kleine Orte ohne eigenen Flughafen (Geo-Fallback via places-Index)

Ortschaften, Kleinstädte und Stadtteile ohne eigenen Flughafen lösen den Geo-Fallback aus:
Das System sucht den Ort im places-Index (GeoNames cities1000, in Kernmärkten ab 1000 Einwohnern), ermittelt dessen Koordinaten und gibt die nächstgelegenen Flughäfen zurück. nearCity ist bei Stufe places gesetzt. Orte, die direkt zu einem Flughafen passen (Stufe airport), liefern diesen als Anker.

Die Ranking-Reihenfolge innerhalb des 150-km-Radius basiert auf einem Entfernungs-Decay-Score (relevance_score × e^(−dist / 15 km), ×1,5 gleiches Land, ×0,4 kleine Flugplätze), sodass näher gelegene Airports bevorzugt werden. Die Entfernung bezieht sich auf den Orts-Anker.

# Eingabe (q) Locale Erstes Ergebnis ICAO Entfernung zum Anker Stufe Hinweis
7b.1 Esslingen de Stuttgart Airport EDDS ~8 km places Kein eigener Airport; nächster relevanter Flughafen ist Stuttgart
7b.2 Esslingen am Neckar de Stuttgart Airport EDDS ~8 km places Vollständiger Ortsname
7b.3 Lutherstadt Wittenberg de Leipzig/Halle Airport EDDP ~57 km places EDDP vor EDDB (~80 km)
7b.4 Wittenberg de Leipzig/Halle Airport EDDP ~57 km places Kurzform; Guard-Fall (EDDP vor EDDB)
7b.5 Heidelberg de Mannheim-City Airport EDFM ~15 km places EDFM zuerst; EDDF (~70 km) an zweiter Stelle
7b.6 Freiburg im Breisgau de Freiburg im Breisgau Airfield EDTF — airport Direkter Flugplatz-Treffer; danach EDTL (~39 km)
7b.7 Bodensee de Friedrichshafen Airport EDNY — nickname Kuratierte Liste; danach LSZR, EDJA, LSZH
7b.8 Lake Constance en Friedrichshafen Airport EDNY ~11 km nickname Englischer Name für Bodensee; danach LSZR, LSZH
7b.9 Potsdam de Berlin Brandenburg EDDB ~30 km places Danach kleine Flugplätze (EDAZ, EDCS)
7b.10 Reims fr Châlons Vatry LFOK — airport Direkter Treffer (Paris-Vatry, Stadt „Reims“); LFPG liegt außerhalb des Radius

Gruppe 8: Ländernamen-Suche

# Eingabe (q) Locale Channel Erwartete Länder-Filterung Hinweise
8.1 Germany en default Top-Airports in Deutschland Synonym: Germany = Deutschland
8.2 Deutschland de default Top-Airports in Deutschland Direkttreffer
8.3 Allemagne fr default Top-Airports in Deutschland Französisch für Deutschland
8.4 Germania it default Top-Airports in Deutschland Italienisch für Deutschland
8.5 Italy en default Top-Airports in Italien
8.6 Spain en default Top-Airports in Spanien
8.7 France en default Top-Airports in Frankreich
8.8 Switzerland en default Top-Airports in der Schweiz
8.9 Schweiz de default Top-Airports in der Schweiz
8.10 United Kingdom en default Top-Airports in UK

Gruppe 9: Leere Suche / Channel-spezifische Top-Airports

Sortierung nach relevance_score (Piste × Region × is_top + Buchungen × 10), gefiltert auf das Land des Channels. Geprüft wird die Menge der Top-10, nicht die exakte Reihenfolge – Buchungsdaten verschieben die Reihenfolge (Stand 2026-10-14).

# Eingabe (q) Channel Erwartet in den Top 10 Hinweise
9.1 (leer) jetappde EDDF, EDDM, EDDB, EDDK Nur deutsche Airports
9.2 (leer) jetappat LOWW, LOWI, LOWS Nur österreichische Airports
9.3 (leer) jetappch LSZH, LSGG, LSZA Nur Schweizer Airports
9.4 (leer) jetappfr LFPO, LFMN Nur französische Airports; LFPG nicht in den Top 10 (is_top=false, kaum Buchungen)
9.5 (leer) jetappit LIMC, LIPZ Nur italienische Airports; LIRF nicht in den Top 10 (LIRA hat mehr Buchungen)
9.6 (leer) jetappcouk EGLL, EGKK, EGSS Nur britische Airports
9.7 (leer) jetappes LEMD, LEBL, LEPA Nur spanische Airports
9.8 (leer) default EDDF, EDDM Global, keine Filterung; Top 10 wird von Buchungsdaten dominiert (LEPA, LSZH, LOWW, …)
9.9 (leer) jetappch_fr LSGG, LSZH, LSZA Schweiz (franz. Channel)
9.10 (leer) jetappch_it LSZA, LSZH Schweiz (ital. Channel); Lugano nicht zwingend vorne

---|---|---|---|---| | 9.1 | (leer) | jetappde | EDDF, EDDM, EDDB, EDDK | Nur deutsche Airports | | 9.2 | (leer) | jetappat | LOWW, LOWI, LOWS | Nur österreichische Airports | | 9.3 | (leer) | jetappch | LSZH, LSGG, LSZA | Nur Schweizer Airports | | 9.4 | (leer) | jetappfr | LFPG, LFPO, LFMN | Nur französische Airports | | 9.5 | (leer) | jetappit | LIRF, LIMC, LIPZ | Nur italienische Airports | | 9.6 | (leer) | jetappcouk | EGLL, EGKK, EGSS | Nur britische Airports | | 9.7 | (leer) | jetappes | LEMD, LEBL, LEPA | Nur spanische Airports | | 9.8 | (leer) | default | EGLL, LFPG, EDDF, EHAM | Global, keine Filterung | | 9.9 | (leer) | jetappch_fr | LSGG, LSZH, LSZA | Schweiz (franz. Channel) | | 9.10 | (leer) | jetappch_it | LSZA, LSZH | Schweiz (ital. Channel, Lugano vorne) |


Gruppe 10: Geo-Koordinaten-Suche (distanceKm gesetzt)

# lat lng q Erwartetes Erstes Ergebnis ICAO Entfernung (ca.)
10.1 48.137 11.576 (leer) München Franz Josef Strauß EDDM ~28 km
10.2 48.137 11.576 Munich München Franz Josef Strauß EDDM ~28 km (kombiniert)
10.3 51.509 -0.118 (leer) London City Airport EGLC ~11 km (nächster)
10.4 48.856 2.352 (leer) Paris Le Bourget (Orly an 2. Stelle) LFPB ~11 km (nächster)
10.5 47.376 8.541 (leer) Zürich Airport LSZH ~11 km
10.6 43.296 5.380 (leer) Marseille Provence LFML ~26 km
10.7 45.464 9.190 (leer) Milan Linate LIML ~7 km
10.8 40.416 -3.703 (leer) Adolfo Suárez Madrid–Barajas LEMD ~14 km
10.9 25.204 55.270 (leer) Dubai International OMDB ~4 km
10.10 52.370 4.895 (leer) Amsterdam Schiphol EHAM ~15 km

Gruppe 11: Filterparameter (region, type)

# Eingabe (q) region type Erwartetes Ergebnis Hinweise
11.0 (leer) — — Standard: large_airport + medium_airport + Legacy-aktive Flughäfen + Whitelist Sonstige small_airports/Heliports nur per type
11.1 (leer) DE-BW — Airports in Baden-Württemberg EDDS, EDSB, EDTL
11.2 (leer) DE-BY — Airports in Bayern EDDM, EDMA, EDDN
11.3 (leer) FR-IDF — Airports in Île-de-France LFPB, LFPO, LFPG (OurAirports kennt nur FR-IDF, keine Départements)
11.4 (leer) — large_airport Nur Großflughäfen Keine Heliports, kein Regionalflughafen
11.5 (leer) — heliport Nur Heliports LNMC, EGLW, …
11.6 Monaco — heliport Monaco Héliport LNMC
11.7 London — large_airport,medium_airport Heathrow, City, Gatwick (kuratierte Reihenfolge), danach Luton, Biggin Hill Nickname-Pin London
11.8 (leer) CH-GE — Airports in Kanton Genf LSGG
11.9 (leer) IT-32 — Airports in Trentino-Südtirol LIPB (Bozen)
11.10 (leer) ES-CT large_airport,medium_airport Airports in Katalonien LEBL, LEGE

Gruppe 12: Limit-Parameter & Caching

# Eingabe limit Erwartetes Verhalten Hinweise
12.1 q=Munich — Max. 10 Ergebnisse (Standard) Default bei nicht-leerem q
12.2 (leer) — 10 Ergebnisse (Standard) Default bei leerem q
12.3 q=London limit=10 Max. 10 Ergebnisse Explizit gesetzt
12.4 q=Paris limit=50 Max. 50 Ergebnisse Maximales Limit
12.5 q=Berlin limit=100 Max. 50 Ergebnisse Über Max → wird auf 50 gecapped
12.6 q=Munich (2. Aufruf) — Identische Antwort, Header X-Cache: HIT 300 s Cache
12.7 q=Munich&l=de vs q=Munich&l=fr — Unterschiedliche Sprachausgabe Cache-Key enthält Locale
12.8 q=Munich&channel=jetappde vs q=Munich&channel=default — Gleiche Airports, anderer Ranking-Kontext Cache-Key enthält Channel

Gruppe 13: Fehler- und Edge-Cases

# Szenario Erwartetes Verhalten HTTP-Status
13.1 q=XXXXXXXXNOTEXISTING Leeres Array [] 200
13.2 q= (explizit leer) Top-Airports wie ohne q 200
13.3 lat=999&lng=999 Ungültige Koordinaten werden ignoriert (kein Geo-Sort) 200
13.4 limit=0 Wird auf 1 angehoben (max(1, limit)) 200
13.5 limit=-1 Wird auf 1 angehoben 200
13.6 l=xx_XX (unbekannte Locale) Fallback auf en oder Default-Sprache 200
13.7 channel=unknownchannel Kein Länderfilter (wie default) 200
13.8 Meilisearch nicht erreichbar Text-Suche fällt auf Legacy-DB-Suche zurück (nicht gecacht) 200
13.9 type=invalid_type Ungültiger Typ wird verworfen → Standard-Typfilter 200
13.10 Sehr langer Suchbegriff (> 500 Zeichen) Kein Absturz, i. d. R. leeres Ergebnis 200

Gruppe 14: Spezial-Airports & Sonderzeichen

# Eingabe (q) Locale Erwartetes Erstes Ergebnis ICAO Besonderheit
14.1 Côte d'Azur fr Nice Côte d'Azur LFMN Apostroph + Akzent
14.2 São Paulo en São Paulo/Guarulhos SBGR Tilde
14.3 Düsseldorf de Düsseldorf Airport EDDL Umlaut ü
14.4 Dusseldorf en Düsseldorf Airport EDDL Ohne Umlaut
14.5 Nürnberg de Nuremberg Airport EDDN Umlaut
14.6 Nuremberg en Nuremberg Airport EDDN Anglisiert
14.7 Reykjavík en Reykjavík Airport (Stadtflughafen) BIRK Isländisch; Keflavík (BIKF) folgt auf Platz 2
14.8 Reykjavik en Reykjavík Airport (Stadtflughafen) BIRK Ohne Akzent
14.9 D'Azur fr Nice Côte d'Azur LFMN Partieller Suchbegriff
14.10 St. Moritz de Samedan Airport LSZS Punkt im Namen

Bekannte Einschränkungen

Einschränkung Details
Keine One-Way-Synonyme Meilisearch unterstützt nur bidirektionale Synonyme. Unidirektionale Aliase (Slang → ICAO) laufen über data/airport_nicknames.json (Feld primary_names)
ISO-2-Ländercodes nicht suchbar country.code ist filterbar, aber nicht durchsuchbar (kein Treffer auf "DE" als Freitext)
Endonym nur bei Abweichung Das Feld endonym ist nur gesetzt, wenn der einheimische Name vom lokalisierten Namen abweicht
nearCity/context nur bei Ortsbezug Direkte Flughafen-Treffer (Name/Stadt/Code) haben kein context; gesetzt bei Nickname, Places, Gebiets-Namen (z. B. „Bodensee") und Synonym-Treffern
Cache 5 Minuten Änderungen am Index sind erst nach 5 Minuten sichtbar (oder Cache-Invalidierung)
Maximales Limit: 50 Höhere limit-Werte werden auf 50 gecapped
Wöchentlicher Datenstand Neueste Flughafen-Änderungen sind frühestens montags nach 4:00 Uhr verfügbar

Dieses Dokument wird bei größeren Feature-Änderungen aktualisiert. Bei Fragen: Development-Team.