Estrazione Filtri: Corrispondenza Regex con Confini di Parola
Questo articolo spiega come estraiamo filtri strutturati per prodotti da query di ricerca in linguaggio naturale utilizzando la corrispondenza regex con confini di parola su mappature frase-filtro.
Il Problema: Dal Linguaggio Naturale ai Filtri Strutturati
Quando un utente cerca "mini pc con 16gb di ram", dobbiamo estrarre:
{
"Form Factor": "Mini PC",
"Main Memory": "16"
}
Questi filtri strutturati abilitano:
-
Filtraggio prodotti: Mostrare solo i prodotti corrispondenti
-
Navigazione a faccette: Visualizzare le opzioni di filtro disponibili
-
Generazione pagine di query: Creare pagine ottimizzate per SEO
-
Ricerche correlate: Trovare query simili
La sfida è gestire tutti i modi in cui gli utenti esprimono la stessa intenzione.
L'Algoritmo: Corrispondenza Regex con Confini di Parola
Passo 1: Carica le Mappature di Frasi
Carichiamo le mappature frase-filtro generate dalla pipeline SEO. Queste mappature collegano frasi a valori di filtro, permettendo la ricerca dalla frase alla corrispondente chiave e valore del filtro.
Invertiamo questa struttura per una ricerca veloce, così possiamo cercare per frase piuttosto che per filtro:
phrase_to_filter = {
"16gb ram": ("Main Memory", "16"),
"16 gb ram": ("Main Memory", "16"),
"mini pc": ("Form Factor", "Mini PC"),
"mini computer": ("Form Factor", "Mini PC")
}
Passo 2: Normalizza la Query
Converti la query in minuscolo per una corrispondenza case-insensitive.
Passo 3: Trova Corrispondenze con Confini di Parola
Per ogni frase nelle mappature, controlliamo se appare nella query utilizzando ancore di confine di parola nelle espressioni regolari.
Le ancore \b assicurano che corrispondiamo a parole intere, non a sottostringhe: "mini pc" corrisponde a "mini pc con ram" ma NON corrisponde a "minipc" (nessuno spazio), e "16gb" corrisponde a "16gb ram" ma NON corrisponde a "216gb" (corrispondenza parziale).
Passo 4: Raccogli Tutte le Corrispondenze
Iteriamo attraverso tutte le frasi e raccogliamo i filtri corrispondenti. Per "mini pc con 16gb ram", questo produce filtri come {"Form Factor": "Mini PC", "Main Memory": "16"}.
Perché i Confini di Parola?
I confini di parola prevengono corrispondenze errate:
Senza confini di parola:
-
"i5" corrisponderebbe a "i5000" (errato)
-
"ram" corrisponderebbe a "program" (errato)
-
"pc" corrisponderebbe a "pcie" (errato)
Con confini di parola: "i5" corrisponde a "processore i5" ✅ ma NON corrisponde a "i5000" ❌; "ram" corrisponde a "16gb ram" ✅ ma NON corrisponde a "program" ❌. L'ancora \b assicura che corrispondiamo solo ai margini delle parole.
Gestione di Corrispondenze Multiple
Se più frasi corrispondono allo stesso filtro, vince l'ultima corrispondenza:
# Query: "mini pc piccolo computer"
# Sia "mini pc" che "piccolo computer" mappano a "Form Factor:Mini PC"
# Risultato: {"Form Factor": "Mini PC"} (deduplicato)
Se più frasi corrispondono a valori diversi per lo stesso filtro, vince l'ultima corrispondenza:
# Query: "8gb 16gb ram"
# "8gb" → Main Memory:8
# "16gb" → Main Memory:16
# Risultato: {"Main Memory": "16"} (vince l'ultima corrispondenza)
Nella pratica, gli utenti raramente specificano valori in conflitto, quindi questo non è un problema.
Priorità delle Frasi
Le frasi vengono confrontate nell'ordine in cui appaiono nelle mappature. Poiché le mappature sono ordinate per similarità (la più alta prima) e poi per lunghezza (la più corta prima), le corrispondenze di qualità più alta vengono controllate per prime. Tuttavia, poiché iteriamo attraverso tutte le frasi, l'ordine non influisce sul risultato finale—vince l'ultima corrispondenza.
Ottimizzazione delle Prestazioni
Caching
La mappatura frase-filtro viene caricata una volta all'avvio e memorizzata nella cache in memoria, evitando I/O ripetuti su disco per ogni richiesta.
Fallback Valkey
Proviamo a caricare le mappature da Valkey (fork di Redis) per prime, con fallback su file JSON:
- Controlla Valkey per una rapida ricerca in memoria
- Carica da JSON in caso di miss su Valkey
- Memorizza in Valkey con scadenza della cache
Questo riduce la latenza per le richieste successive.
Corrispondenza Regex
I pattern usano re.search() con ancore di confine di parola per corrispondere efficientemente a parole intere senza false corrispondenze parziali.
Integrazione con il Servizio di Ricerca
L'estrazione dei filtri è implementata come endpoint di servizio API che accetta query di ricerca e restituisce i filtri estratti.
Il servizio:
- Accetta una query di ricerca come input
- Carica le mappature frase-filtro in memoria
- Normalizza e trova corrispondenze di frasi con confini di parola
- Restituisce coppie chiave-valore di filtri strutturati
Il server web principale chiama questo servizio per estrarre filtri dalle query degli utenti:
filters = extract_filters_from_query("mini pc 16gb ram")
# Restituisce: {"Form Factor": "Mini PC", "Main Memory": "16"}
Questa separazione delle responsabilità permette:
-
Scalabilità indipendente: L'estrazione dei filtri può essere eseguita su un server separato
-
Isolamento della cache: Il servizio gestisce la propria cache di mappature
-
Riavvio del servizio: Il servizio può essere riavviato indipendentemente senza influenzare il server web principale
Vedi Architettura del Servizio di Ricerca per i dettagli.
Registrazione delle Query
Ogni estrazione di filtro viene registrata per il consumo della pipeline SEO. Questi log alimentano nuovamente la pipeline SEO per scoprire nuovi pattern di query e migliorare le mappature di frasi nel tempo.
Casi d'Uso
Pagine di Query (/q/)
Le pagine di query estraggono i filtri dallo slug dell'URL per determinare quali prodotti visualizzare.
API di Ricerca (/api/search)
L'API di ricerca estrae i filtri dalla query di ricerca per trovare e restituire i prodotti corrispondenti.
Autocompletamento
I suggerimenti di autocompletamento estraggono i filtri per fornire anteprime dei filtri insieme ai suggerimenti di ricerca.
Ricerche Correlate
La generazione di ricerche correlate utilizza i filtri estratti per trovare query simili:
Query: "mini pc 16gb ram"
→ Filtri: {"Form Factor": "Mini PC", "Main Memory": "16"}
→ Trova query con filtri simili
→ Suggerisci: "mini pc 32gb ram", "mini pc 16gb ssd"
Vedi Generazione di Ricerche Correlate per i dettagli.
Gestione degli Errori
Mappature Mancanti
Se le mappature di frasi non sono caricate, restituiamo filtri vuoti. Questo previene crash quando la pipeline SEO non è ancora stata eseguita.
Query Non Valide
Query vuote o contenenti solo spazi restituiscono filtri vuoti.
Errori Regex
Utilizziamo l'escape regex per sanificare le frasi prima della corrispondenza regex, prevenendo errori di sintassi da caratteri speciali nelle frasi.
Caratteristiche delle Prestazioni
L'estrazione dei filtri opera efficientemente grazie alla corrispondenza regex con confini di parola e a un caching aggressivo:
-
Il caricamento delle mappature avviene una volta all'avvio
-
L'estrazione per query è limitata dalla CPU (corrispondenza regex)
-
L'uso della memoria per le cache rimane gestibile
-
I tassi di hit della cache sono alti in produzione
La regex con confini di parola è più veloce della ricerca di sottostringhe perché il motore regex può saltare efficientemente le posizioni non corrispondenti.
Limitazioni
Dipendenza dall'Ordine delle Frasi
Troviamo corrispondenze per le frasi nell'ordine di iterazione, che non è garantito. Se due frasi si sovrappongono, vince l'ultima corrispondenza:
# Query: "mini pc"
# Frasi: ["mini", "mini pc"]
# Se "mini" viene controllata per ultima, sovrascrive "mini pc"
Nella pratica, questo non accade perché:
-
Le frasi più lunghe sono più specifiche e appaiono per prime nelle mappature ordinate
-
Le frasi sovrapposte di solito mappano allo stesso valore di filtro
Nessuna Combinazione di Frasi
Non combiniamo più frasi in un singolo valore di filtro:
# Query: "dual core quad core"
# Risultato: {"Cores": "4"} (vince l'ultima corrispondenza)
# NON: {"Cores": ["2", "4"]} (valori multipli)
Questo è intenzionale—gli utenti raramente specificano più valori per lo stesso filtro.
Nessuna Negazione
Non gestiamo la negazione (es. "mini pc senza Windows"). La negazione è rara nelle query di ricerca, quindi non è attualmente supportata.
Riferimenti
Concetti Tecnici
-
Espressione Regolare - Wikipedia
-
Confine di Parola - Wikipedia
-
Valkey - Sito ufficiale
-
Redis - Sito ufficiale (fork di Valkey)
Documentazione Python
-
re.search() - Documentazione Python
-
re.escape() - Documentazione Python
Articoli Correlati
-
Mappature Frase-Filtro - Come vengono generate le mappature
-
Architettura del Servizio di Ricerca - Servizio di ricerca standalone
-
Pagine di Query vs Pagine di Ricerca - Tipi di pagina diversi
-
Generazione di Ricerche Correlate - Utilizzo dei filtri per query correlate
-
Panoramica della Pipeline SEO - Architettura completa della pipeline
Riepilogo
Estriamo filtri dalle query di ricerca utilizzando la corrispondenza regex con confini di parola:
-
Carica mappature: Mappature frase-filtro dalla pipeline SEO
-
Normalizza query: Converti in minuscolo
-
Trova corrispondenze frasi: Usa i confini di parola
\bper corrispondere a parole intere -
Raccogli filtri: Costruisci dizionario di coppie chiave-valore filtro
-
Cache aggressiva: Cache in memoria + fallback Valkey
-
Registra query: Alimenta nuovamente la pipeline SEO
L'algoritmo è semplice, efficiente e gestisce tutte le variazioni di frase generate dalla pipeline SEO. I confini di parola prevengono false corrispondenze permettendo un flessibile matching di frasi. Il risultato è un'estrazione robusta dei filtri che alimenta pagine di query, ricerca, autocompletamento e ricerche correlate.