Quando un’azienda inizia a gestire migliaia di clienti, ordini, documenti o ticket dentro una web app, la prima cosa che smette di funzionare è la ricerca. Il classico filtro che interroga il database con un LIKE ‘%testo%’ diventa lento, ignora gli errori di battitura e restituisce risultati nell’ordine sbagliato. Una buona ricerca full-text per web app non è un dettaglio: è ciò che trasforma un gestionale frustrante in uno strumento che le persone usano davvero. In questo articolo spiego come la progetto e la realizzo per i miei clienti, con uno stack moderno e self-hosted che resta sotto controllo dell’azienda.
Perché la ricerca “del database” non basta per una web app aziendale
Un database relazionale come PostgreSQL o MySQL è perfetto per conservare e mettere in relazione i dati, ma non è nato per la ricerca testuale moderna. Quando l’utente digita nella barra di ricerca si aspetta tre cose che il semplice LIKE non offre:
- Tolleranza agli errori: cercare “fattrua” e trovare comunque “fattura”.
- Risultati pertinenti per primi: chi cerca “Rossi” vuole il cliente Rossi in cima, non la cinquantesima riga che contiene quel testo in una nota.
- Velocità istantanea: risultati che compaiono mentre si digita, anche su tabelle con centinaia di migliaia di righe.
Esistono soluzioni cloud chiavi in mano, ma per le aziende hanno due problemi: i dati sensibili escono dai server dell’azienda e i costi crescono con il volume. La mia scelta, quando ha senso, è un motore di ricerca self-hosted, installato sulla stessa infrastruttura della web app. Si ottiene una ricerca di livello professionale mantenendo controllo, privacy e costi prevedibili.
Lo stack che uso per la ricerca full-text
Ho costruito e gestisco end-to-end diverse web app — tra cui apicco.app e tandemops.app — e in questi progetti la ricerca è un componente di prima classe, non un ripensamento. Ecco l’architettura tipica:
- Motore di ricerca: un’istanza self-hosted di Meilisearch o Typesense. Sono motori open source, leggeri e velocissimi, pensati proprio per la ricerca “as-you-type” con correzione degli errori e ordinamento per pertinenza già inclusi.
- Sorgente dati: PostgreSQL resta la fonte di verità. Il motore di ricerca contiene solo una copia indicizzata dei campi utili (nome, email, riferimento, tag), non sostituisce il database.
- Sincronizzazione: ogni volta che un record viene creato o modificato, un processo in background aggiorna l’indice. Così la ricerca riflette sempre lo stato reale dei dati senza rallentare le operazioni dell’utente.
- Frontend: un’interfaccia in React e TypeScript con una barra di ricerca che mostra i risultati in tempo reale, con evidenziazione del testo trovato e filtri per categoria.
- Infrastruttura: tutto gira in container Docker gestiti con Portainer, dietro un reverse proxy Nginx con certificato SSL. Il motore di ricerca non è mai esposto direttamente: il frontend parla con il backend, che fa da intermediario sicuro verso l’indice.
Come funziona, passo per passo
L’esperienza per l’utente finale è semplice, ma dietro c’è un flusso preciso. Quando un dipendente apre il portale e digita nella barra di ricerca, la richiesta arriva al backend, che la inoltra al motore di ricerca interno applicando i permessi dell’utente — un punto cruciale in azienda, perché non tutti devono vedere tutto. Il motore restituisce in pochi millisecondi i risultati già ordinati per pertinenza, il backend li filtra in base al ruolo e il frontend li mostra evidenziando il termine cercato.
La parte più delicata, e quella che fa la differenza tra una ricerca che funziona e una che si “disallinea”, è la sincronizzazione. Uso processi in background ed eventi sul database per mantenere l’indice sempre coerente: se un cliente cambia nome o un documento viene archiviato, l’indice viene aggiornato in automatico, senza intervento manuale e senza far attendere l’utente.
Cosa dimostra tutto questo sul piano dello sviluppo
Realizzare una ricerca full-text seria tocca tutti i livelli di una web app: il design dell’interfaccia, l’architettura del backend, la gestione dei permessi, la sincronizzazione dei dati e l’infrastruttura che ospita il tutto. È esattamente il tipo di lavoro full-stack che svolgo: non solo scrivere codice, ma far convivere frontend, backend, database e server in modo che il risultato sia veloce, sicuro e affidabile nel tempo.
Quando costruisco una funzionalità del genere penso sempre alla manutenzione: documentazione chiara, container riproducibili, backup dell’indice e monitoraggio. Un’azienda non vuole una demo che funziona oggi, vuole uno strumento che continui a funzionare tra due anni mentre i dati crescono.
Quando una ricerca avanzata conviene davvero
Non ogni progetto ha bisogno di un motore di ricerca dedicato. Per un sito vetrina o una web app con poche centinaia di record, la ricerca nativa del database è più che sufficiente. La ricerca full-text self-hosted diventa un investimento sensato quando:
- gli utenti cercano spesso e la velocità incide sulla loro produttività;
- i dati sono molti e in crescita (clienti, prodotti, documenti, ticket);
- serve cercare contemporaneamente su più tipi di contenuto;
- i dati sono sensibili e devono restare su server controllati dall’azienda.
In questi casi la differenza per chi usa la web app ogni giorno è enorme: trovare in un secondo ciò che prima richiedeva diversi clic e attese.
Vuoi una web app con una ricerca davvero efficace?
Se la tua azienda usa un gestionale, un portale o una web app in cui trovare le informazioni è diventato lento o frustrante, posso aiutarti. Progetto e sviluppo applicazioni web su misura end-to-end — dall’interfaccia all’infrastruttura — con soluzioni self-hosted che mantengono i tuoi dati al sicuro e i costi sotto controllo.
Dai un’occhiata ai miei progetti come apicco.app e tandemops.app, scopri come lavoro su cornelcaba.com, e se vuoi parlarne contattami direttamente dalla pagina contatti. Raccontami cosa cerca la tua web app: costruiamo insieme lo strumento che la tua azienda merita.
