Glossaire
Termes spécifiques à
better-search. Pour les concepts métier (Travel, Occurrence, Booking, etc.), voir le glossaire despektrum-buchard-horizon.
Recherche & pertinence
- Embedding — vecteur de 3584 nombres flottants qui représente le sens d'un texte. Calculé par BGE Multilingual Gemma2 via Infomaniak. Stocké en colonne
embedding vector(3584)(extensionpgvector). - Similarité cosinus — score entre
0et1(typiquement) qui mesure à quel point deux embeddings « pointent dans la même direction » sémantiquement.1.0= sens identique,0.0= sans rapport. Exposée en réponse sous le nomsemantic_score. tsvector— type Postgres pour la recherche plein-texte. Construit ici viato_tsvector('french', …)avec pondération A/B/C surname/subtitle/description. Voir colonne généréesearch_vectordansarchitecture/schema.md.ts_rank_cd— fonction Postgres qui score la pertinence FTS d'un document par rapport à unetsquery. Plus c'est haut, mieux c'est. Exposé en réponse sous le nomtsvector_score.websearch_to_tsquery— fonction Postgres qui parse une requête utilisateur (avecOR,-, guillemets, etc.) entsqueryexploitable. Utilisé pour transformer le?search=du front en quelque chose que Postgres peut matcher.- RRF (Reciprocal Rank Fusion) — méthode de fusion de classements. Combine le rang vectoriel et le rang textuel en un score unique :
w · 1/(60+rv) + (1-w) · 1/(60+rt). Voirarchitecture/hybrid-search.mdet l'ADR0002. _relevance_score— score RRF final exposé dans chaque record retourné. Vaut1.0en branche filtre-seul (pas de?search=). Ne pas l'exposer comme un pourcentage de pertinence en UI — c'est un score relatif.semanticFloor/DEFAULT_SEMANTIC_FLOOR— plancher de similarité cosinus. Un voyage avecsemantic_score < semanticFloorest éliminé sauf s'il passe via le plancher texte.tsvectorFloor/DEFAULT_TSVECTOR_FLOOR— plancher dets_rank_cd. Idem, plancher OR avec le précédent.rrfVectorWeight/DEFAULT_RRF_VECTOR_WEIGHT— pondérationwdu RRF.0= pur texte,1= pur vecteur,0.5= équilibré.- Branche hybride — chemin SQL pris quand
?search=est non vide : CTE vector_search + text_search + rrf_scores avec planchers. - Branche filtre-seul — chemin SQL pris quand
?search=est vide : pas d'embedding, pas de RRF, simpleSELECT … FROM travels_view WHERE … ORDER BY {orderBy}.
Modèle de données
raw_data— colonne JSONB qui contient le record voyage entier tel que retourné par l'amont Horizon. Source de vérité unique du service.- Colonne générée (
GENERATED ALWAYS AS … STORED) — colonne Postgres calculée à partir d'autres colonnes (typiquementraw_data) et matérialisée sur disque. Indexable comme une colonne normale. Voir ADR0001etarchitecture/schema.md. travels— table de stockage principale.travels_view— vue Postgres qui ajoutenext_departurecalculé et filtre les voyages sans départ futur. Tous les SELECT de recherche passent par cette vue, pas la table.next_departure—MIN()desdeparture_dates> CURRENT_DATE. Calculé dans la vue, exposé vianextDepartureen réponse (modecard).jsonb_to_text_array(j, path)/jsonb_to_timestamp_array(j, path)— fonctions helper SQL utilisées dans les définitions de colonnes générées.IMMUTABLE, ne pas modifier sans plan de migration.
Ingestion / Reindex
- Slow-backend — l'amont Horizon (
SLOW_SEARCH_URL), historiquement nommé ainsi pour le distinguer debetter-search. Documenté dans le knowledge basespektrum-buchard-horizon. - Reindex — cycle d'ingestion complet : pull amont, embed, UPSERT, purge stale, MAJ métriques. Voir
architecture/reindex-lifecycle.md. /seaside— sous-endpoint de l'amont (${SLOW_SEARCH_URL}/seaside) qui retourne les voyages balnéaires. Ingéré en deuxième position dans le pipeline, avecisSeaside=trueinjecté dans chaque record avant insertion.is_seaside— colonne générée booléenne reflétantraw_data->>'isSeaside'. Indexée pour filtrer via?seaside=true|false.new_ids— set Python qui accumule les ids ingérés pendant un cycle. Le DELETE final supprime detravelstout id absent de ce set.- Lock global —
threading.Lock+ flag booléen_reindex_runningqui empêche deux reindex de tourner en parallèle dans le même process. Voir ADR0005. _maybe_reindex()— méthode appelée parBuchardDatabase.__init__au boot. Reindexe si la DB est vide ou si la dernière mise à jour date de > 15 min.
API & contrat front
infoDensity— paramètre query?infoDensity=min|card|search|fullqui contrôle quels champs sont renvoyés dans chaque record. Implémentation :apply_info_densitydanssrc/_utils.py.min:id,name,slug, scores.card:id,name, scores,description,rating,slug,nextDeparture.search: champs équivalents aux colonnes générées (destination,discount_club,is_valid,travel_ranges,departure_dates) + scores.full(défaut si non précisé) :raw_dataentier + scores.
ResultPage— modèle Pydantic de réponse de/travels. Champs :totalRecords,totalFilteredRecords,page,records.totalRecordsvstotalFilteredRecords—totalRecords=_total_countcalculé parCOUNT(*) OVER()(compte total après filtres + planchers, avant pagination).totalFilteredRecords=len(records)(taille de la page courante après pagination). Nommage hérité du contrat Horizon.
Observabilité
n_results_in_search— histogramme Prometheus du nombre de résultats retournés. Buckets[0, 10, 25, 50, 75, 100, 150, 200].reindex_time_s— histogramme du temps d'un cycle reindex. Buckets[15, 30, 45, 60, 75, 90, 120, 240].last_reindex_time— gauge timestamp Unix de la fin du dernier reindex.db_size— gauge duCOUNT(*)post-reindex.prometheus-fastapi-instrumentator— bibliothèque qui ajoute automatiquement les métriques HTTP standard (http_requests_total,http_request_duration_seconds, etc.) sur/metrics.
Build & release
buchsearch— nom de l'image Docker (registryregistry.internal.spektrum-suisse.ch/buchsearch). À ne pas confondre avec le nom du repobuchard-better-search.VERSION_TAG— version applicative, injectée audocker buildvia--build-arget exposée par l'endpoint/. FormeX.Y.ZouX.Y.Z-staging.N.BUILD_DATE— timestamp ISO 8601 du build Docker, idem, exposé sur/.@spektrum/release-util— outil npm interne qui automatise la création de branchesrelease/*, l'incrément SemVer, le changelog et le push de tags Git. Voirmodules/releasing.md.latest/latest-staging— tags Docker mobiles.latestpointe sur la dernière release prod,latest-stagingsur la dernière release staging.- Yoyo
--batch— flag passé àyoyo applyqui supprime la confirmation interactive. Indispensable pour un démarrage de conteneur non interactif.
Tests
date_offset— décalage de timedelta calculé dynamiquement (tests/conftest.py) pour que les dates detest_db.json(référence2025-12-29) tombent toujours dans le futur au moment du run. Évite que les tests deviennent obsolètes avec le temps.auto_reindex=False— argument à passer àBuchardDatabasedans les tests pour éviter le reindex automatique au boot.mock_infomaniak_api/mock_slow_search_api— fixtures pytest qui patchentrequests.postetrequests.getpour retourner des embeddings et records fixtures (tests/test_embeddings.json,tests/test_query_embeddings.json,tests/test_db.json).shifted_date— fixture qui décale une date YYYY-MM-DD d'origine pardate_offsetpour matcher la fixture.
Contributors
No contributors
Changelog
No recent changes

