Add advanced search engine with inverted index, thread pool execution, configuration API, and comprehensive diagnostics
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
||||
|
||||
[]()
|
||||
[]()
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://www.docker.com/)
|
||||
[](https://www.python.org/)
|
||||
@@ -359,6 +359,9 @@ ObsiGate expose une API REST complète :
|
||||
| `/api/image/{vault}?path=` | Servir une image avec MIME type approprié | GET |
|
||||
| `/api/attachments/rescan/{vault}` | Rescanner les images d'un vault | POST |
|
||||
| `/api/attachments/stats?vault=` | Statistiques d'images indexées | GET |
|
||||
| `/api/config` | Lire la configuration | GET |
|
||||
| `/api/config` | Mettre à jour la configuration | POST |
|
||||
| `/api/diagnostics` | Statistiques index, mémoire, moteur de recherche | GET |
|
||||
|
||||
> Tous les endpoints exposent des schémas Pydantic documentés. La doc interactive est disponible sur `/docs` (Swagger UI).
|
||||
|
||||
@@ -464,19 +467,39 @@ docker-compose logs --tail=100 obsigate
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Performance
|
||||
|
||||
| Métrique | Estimation |
|
||||
|----------|------------|
|
||||
| **Indexation** | ~1–2s pour 1 000 fichiers markdown |
|
||||
| **Recherche fulltext** | < 50ms (index en mémoire, zéro I/O disque) |
|
||||
| **Indexation** | ~1–2s pour 1 000 fichiers markdown |
|
||||
| **Recherche avancée** | < 10ms pour la plupart des requêtes (index inversé + TF-IDF) |
|
||||
| **Résolution wikilinks** | O(1) via table de lookup |
|
||||
| **Mémoire** | ~80–150MB par 1 000 fichiers (contenu capé à 100 KB/fichier) |
|
||||
| **Mémoire** | ~80–150MB par 1 000 fichiers (contenu capé à 100 KB/fichier) |
|
||||
| **Image Docker** | ~180MB (multi-stage, sans outils de build) |
|
||||
| **CPU** | Minimal ; pas de polling, pas de watchers |
|
||||
| **CPU** | Non-bloquant ; recherche offloadée sur thread pool dédié |
|
||||
|
||||
### Optimisations clés (v1.1.0)
|
||||
### Paramètres recommandés par taille de vault
|
||||
|
||||
| Taille | Fichiers | `search_workers` | `prefix_max_expansions` | `max_content_size` |
|
||||
|--------|----------|-------------------|--------------------------|---------------------|
|
||||
| Petit | < 500 | 1 | 50 | 100 000 |
|
||||
| Moyen | 500–5 000 | 2 | 50 | 100 000 |
|
||||
| Grand | 5 000+ | 4 | 30 | 50 000 |
|
||||
|
||||
Ces paramètres sont configurables via l'interface (Settings) ou l'API `/api/config`.
|
||||
|
||||
### Optimisations clés (v1.2.0)
|
||||
|
||||
- **Index inversé avec set-intersection** : la recherche utilise les posting lists pour un retrieval O(k × postings) au lieu de O(N) scan complet
|
||||
- **Prefix matching par recherche binaire** : O(log V + k) au lieu de O(V) scan linéaire du vocabulaire
|
||||
- **ThreadPoolExecutor** : les fonctions de recherche CPU-bound sont offloadées du event loop asyncio
|
||||
- **Race condition guard** : `currentSearchId` + `AbortController` empêchent le rendu de résultats obsolètes
|
||||
- **Progress bar** : barre de progression animée pendant la recherche
|
||||
- **Search timeout** : abandon automatique après 30s (configurable)
|
||||
- **Query time display** : temps serveur affiché dans les résultats (`query_time_ms`)
|
||||
- **Staleness detection fix** : utilisation d'un compteur de génération au lieu de `id(index)` pour détecter les changements d'index
|
||||
|
||||
### Optimisations v1.1.0
|
||||
|
||||
- **Recherche sans I/O** : le contenu des fichiers est mis en cache dans l'index mémoire
|
||||
- **Scoring multi-facteurs** : titre exact (+20), titre partiel (+10), chemin (+5), tag (+3), fréquence contenu (x1 par occurrence, capé à 10)
|
||||
@@ -582,6 +605,30 @@ Ce projet est sous licence **MIT** - voir le fichier [LICENSE](LICENSE) pour les
|
||||
|
||||
## 📝 Changelog
|
||||
|
||||
### v1.2.0 (2025)
|
||||
|
||||
**Performance (critique)**
|
||||
- Réécriture du moteur `advanced_search()` : retrieval par set-intersection sur l'index inversé (O(k × postings) au lieu de O(N))
|
||||
- Prefix matching par recherche binaire sur liste triée de tokens (O(log V + k) au lieu de O(V))
|
||||
- Offload des fonctions de recherche CPU-bound via `ThreadPoolExecutor` (2 workers par défaut)
|
||||
- Pré-calcul des expansions de préfixe pour éviter les recherches binaires répétées
|
||||
- Fix du bug de staleness : `is_stale()` utilise un compteur de génération au lieu de `id(index)`
|
||||
|
||||
**Frontend**
|
||||
- Guard contre les race conditions : `currentSearchId` vérifié après chaque `fetch` avant rendu
|
||||
- Barre de progression animée pendant la recherche
|
||||
- Timeout de recherche configurable (30s par défaut)
|
||||
- Longueur minimale de requête configurable (2 caractères par défaut)
|
||||
- Affichage du temps de requête serveur (`query_time_ms`) dans les résultats
|
||||
- Pagination ajoutée sur l'endpoint legacy `/api/search` (params `limit`/`offset`)
|
||||
|
||||
**Configuration & Diagnostics**
|
||||
- Nouveaux endpoints `GET/POST /api/config` pour la configuration persistante (`config.json`)
|
||||
- Nouveau endpoint `GET /api/diagnostics` (stats index, mémoire, moteur de recherche)
|
||||
- Page de configuration étendue : paramètres frontend (debounce, résultats/page, timeout) et backend (workers, boosts, expansions)
|
||||
- Panel de diagnostics intégré dans la modal de configuration
|
||||
- Boutons « Forcer réindexation » et « Réinitialiser » dans les paramètres
|
||||
|
||||
### v1.1.0 (2025)
|
||||
|
||||
**Sécurité**
|
||||
@@ -621,4 +668,4 @@ Ce projet est sous licence **MIT** - voir le fichier [LICENSE](LICENSE) pour les
|
||||
|
||||
---
|
||||
|
||||
*Projet : ObsiGate | Version : 1.1.0 | Dernière mise à jour : 2025*
|
||||
*Projet : ObsiGate | Version : 1.2.0 | Dernière mise à jour : 2025*
|
||||
|
||||
Reference in New Issue
Block a user