Aller au contenu principal

Exemples de Middleware

Des exemples pratiques pour construire et utiliser les middleware de Whoosh-NG.

1. Middleware de Logging​

from whoosh.middleware.base import Middleware
from whoosh.middleware.context import MiddlewareContext

class LoggingMiddleware(Middleware):
def before_search(self, context: MiddlewareContext) -> MiddlewareContext:
print(f"[RECHERCHE] Requête: {context.query}")
return context

def after_search(self, context: MiddlewareContext) -> MiddlewareContext:
if context.results is not None:
print(f"[RÉSULTATS] {len(context.results)} résultats trouvés")
return context

2. Middleware de Metrics​

from whoosh.middleware.base import Middleware
from whoosh.middleware.context import MiddlewareContext

class MetricsMiddleware(Middleware):
def __init__(self) -> None:
self._metrics = {}

def after_index(self, context: MiddlewareContext) -> MiddlewareContext:
self._metrics["documents_indexés"] = self._metrics.get("documents_indexés", 0) + 1
return context

def after_search(self, context: MiddlewareContext) -> MiddlewareContext:
self._metrics["recherches_executées"] = self._metrics.get("recherches_executées", 0) + 1
return context

def get_metrics(self) -> dict:
return dict(self._metrics)

3. Middleware de Cache​

from whoosh.middleware.base import Middleware
from whoosh.middleware.context import MiddlewareContext

class SearchCacheMiddleware(Middleware):
def __init__(self) -> None:
self._cache = {}

def before_search(self, context: MiddlewareContext) -> MiddlewareContext:
if context.query and str(context.query) in self._cache:
context.metadata["_résultat_cache"] = self._cache[str(context.query)]
return context

def after_search(self, context: MiddlewareContext) -> MiddlewareContext:
if context.query and context.results is not None:
self._cache[str(context.query)] = context.results
return context

4. Appliquer un Middleware​

from whoosh.middleware.chain import MiddlewareChain
from whoosh.middleware.integration import apply_middleware_to_searcher

chain = MiddlewareChain([
LoggingMiddleware(),
MetricsMiddleware(),
])

with ix.searcher() as base_searcher:
searcher = apply_middleware_to_searcher(base_searcher, chain.middlewares)
results = searcher.search(query)

Points clés​

HookPhaseDescription
startupInitAppelé une fois à l'initialisation
shutdownNettoyageAppelé à la fermeture
before_indexIndexationAvant l'ajout d'un document
after_indexIndexationAprès l'ajout d'un document
before_deleteSuppressionAvant la suppression
after_deleteSuppressionAprès la suppression
before_searchRechercheAvant l'exécution de la requête
after_searchRechercheAprès le retour des résultats
on_errorErreurEn cas d'exception
on_commitCommitAprès writer.commit()