# Ricerca semantica nel sito: quando bastano i sinonimi

Gli embedding servono quando la query non usa le parole del contenuto. Con un vocabolario chiuso una tabella di sinonimi risponde prima e costa zero.

> Pagina: https://ui.eneawork.it/blog/ai-ricerca-semantica-sito
> Markdown: https://ui.eneawork.it/blog/ai-ricerca-semantica-sito.md

*2026-11-01*

La ricerca semantica serve quando chi cerca usa parole diverse da quelle del contenuto; se il vocabolario è chiuso e prevedibile, una tabella di sinonimi costa zero e risponde in meno di un secondo.

La ricerca icone di EneUI non usa embedding: in backend/server.js c'è una tabella di 45 chiavi e 217 termini per 2.663 byte, letta il 1 novembre 2026. La stessa data /api/icons?q=delete ha risposto con 296 risultati in 726 byte e 378 ms, mentre q=dashboard ha dato 12 risultati in 739 byte e 537 ms. Il catalogo dietro conta 12.808 icone, 111.985 componenti e 1.472 librerie, letti da /api/stats. La guida OpenAI sugli embedding, letta lo stesso giorno, dichiara 1.536 dimensioni e 8.192 token di input per text-embedding-3-small, al prezzo di 0,02 $ per milione di token.

## Quando una mappa basta

Una mappa di sinonimi copre il vocabolario che conosci: icone, categorie, stati. Non richiede servizi, non ha latenza di rete e si revisiona leggendo un file. Il limite è che qualcuno deve scriverla e tenerla aggiornata.

Sono misure singole, misurate da un client HTTP il 1 novembre 2026 con una richiesta per query: valgono come ordine di grandezza, non come media.

## Quando servono i vettori

Gli embedding servono quando la query è una frase e il contenuto non contiene quelle parole. Il prezzo si paga in tre punti: generazione, archiviazione e indice.

La matrice si calcola in fretta: 111.985 vettori da 1.536 dimensioni in float32 occupano 688.035.840 byte, circa 656 MiB, prima di qualsiasi indice.

CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE component_embedding ( component_id text PRIMARY KEY, embedding vector(1536) NOT NULL ); CREATE INDEX ON component_embedding USING hnsw (embedding vector_cosine_ops);

## Ibrido, non religioso

La ricerca che funziona somma due segnali: il filtro esatto su categoria e libreria e la similarità sul testo. Il filtro riduce lo spazio prima del calcolo, quindi il risultato resta corretto anche quando il vettore sbaglia.

## La limitazione

Non abbiamo una misura di qualità: recall e precisione richiedono un set di query con la risposta attesa, e questo sito non lo ha pubblicato. Il pacchetto pgvector 0.3.0 su npm pesa 52.767 byte, letto il 1 novembre 2026, ma l'indice HNSW vive in memoria e va dimensionato.

## Dove continuare

Una palette da tastiera sopra la ricerca è in command menu con shadcn, la scelta del database in SQLite o Postgres, i filtri di catalogo in ricerca a faccette. I record: 111.985 componenti, 12.808 icone, Aceternity UI.

## FAQ

### La ricerca semantica migliora sempre i risultati?

No. Migliora le query in linguaggio naturale e peggiora quelle esatte, come un codice prodotto o un nome di componente. Per questo si usa in ibrido con un filtro esatto.

### Quanto costa indicizzare un catalogo di 111.985 elementi?

Dipende dai token di ogni elemento. Con text-embedding-3-small a 0,02 $ per milione di token, il costo è il numero di token diviso un milione per 0,02 $. Lo spazio è prevedibile: circa 656 MiB in float32 a 1.536 dimensioni.

### Serve un database vettoriale dedicato?

No per un catalogo di questa scala. Postgres con pgvector, o SQLite con sqlite-vec, tengono i vettori accanto ai dati e permettono di filtrare nella stessa query.

### Quanti risultati deve restituire la ricerca?

Dieci sono un buon punto di partenza per una pagina di catalogo, con paginazione a cursore dopo. Il numero vero dipende da quante righe l'utente riesce a valutare prima di cambiare query.

### Come misuro se la ricerca è migliorata?

Con un set di venti o trenta query reali e il risultato atteso scritto accanto, misurando quanti risultati corretti compaiono nei primi dieci. Senza quel set ogni confronto è un'impressione.
