Aller au contenu principal

Recherche Sémantique

Architecture

Nomu utilise Meilisearch comme moteur de recherche vectorielle, couplé aux embeddings OpenAI pour une recherche sémantique hybride (keyword + vecteurs).

Configuration de l'index

L'index est configuré au démarrage du serveur via setupMeilisearchAI() :

// app/server.js

// 1. Activer le vector store
await fetch(`${MEILI_HOST}/experimental-features`, {
method: 'PATCH',
body: JSON.stringify({ vectorStore: true }),
})

// 2. Configurer l'embedder OpenAI
const embedderConfig = {
'profiles-openai': {
source: 'openAi',
apiKey: OPENAI_API_KEY,
model: 'text-embedding-3-small',
documentTemplate:
'{{doc.name}}, {{doc.location}}. {{doc.biography}}. Intérêts: {{doc.interests}}. {{doc.country}}, {{doc.city}}',
},
}

// 3. Configurer les attributs filtrables
await fetch(`.../settings/filterable-attributes`, {
body: JSON.stringify(['interests', 'location', 'country', 'city']),
})

Document template

Le template définit ce qui est vectorisé pour chaque profil :

{{doc.name}}, {{doc.location}}. {{doc.biography}}. Intérêts: {{doc.interests}}. {{doc.country}}, {{doc.city}}

Exemple rendu :

Marie Dupont, Paris. Je propose des randonnées guidées autour de Paris. Intérêts: Randonnée, Cuisine. France, Paris

Réindexation

L'index est maintenu à jour par trois mécanismes :

DéclencheurQuand
Démarrage serveurAu boot, réindexation complète
SchedulerToutes les 2 heures automatiquement
Actions utilisateurMise à jour profil, toggle searchable, update interests
Script manuelnpm run reindex