Meilisearch: cos'è, come funziona e quando conviene usarlo
Meilisearch è un motore di ricerca open source scritto in Rust, distribuito come singolo eseguibile e pensato per affiancare l'applicazione invece di vivere dentro il suo database. Regole di ranking ispezionabili, faccette native, sinonimi, tolleranza ai refusi configurabile per campo e ricerca semantica eseguita in locale senza servizi esterni.
Che cos'è Meilisearch
Meilisearch è un motore di ricerca open source scritto in Rust, distribuito come singolo eseguibile e progettato per essere installato accanto all'applicazione invece che dentro il suo database.
Riceve documenti in formato JSON, costruisce un indice invertito e risponde alle interrogazioni via API HTTP. Un indice invertito è una struttura in cui, per ogni parola, esiste già la lista ordinata dei documenti che la contengono: cercare significa leggere quella lista, non scandire una tabella.
È la differenza sostanziale rispetto alla ricerca eseguita dentro un database relazionale. MySQL e PostgreSQL sono nati per garantire integrità e relazioni fra i dati, non per cercare testo, e quando lo fanno oltre una certa dimensione risultano lenti, imprecisi o entrambe le cose.
Come Meilisearch decide l'ordine dei risultati
L'ordinamento non è un punteggio opaco ma una sequenza di regole applicate in cascata, visibili e modificabili. Nella configurazione predefinita sono sette, in quest'ordine: numero di termini trovati, numero di refusi, prossimità fra i termini, importanza del campo in cui la corrispondenza è avvenuta, criterio di ordinamento esplicito, posizione della parola nel campo, corrispondenza esatta.
Quando due documenti pareggiano sulla prima regola si passa alla seconda, e così via. Si possono riordinare le regole, rimuoverne alcune o aggiungerne di proprie basate su un campo numerico, per esempio per far pesare il numero di vendite o la valutazione media.
La conseguenza pratica più importante riguarda l'ordine dei campi dichiarati come ricercabili: quella lista non è un elenco, è una gerarchia. La regola sull'importanza del campo usa quell'ordine, e spostare un campo cambia la classifica dei risultati.
Tolleranza ai refusi, filtri e faccette
Meilisearch tollera gli errori di battitura in modo configurabile: si imposta quanti errori accettare in base alla lunghezza della parola, e si può disattivare la tolleranza campo per campo. È una distinzione utile, perché su un codice prodotto un refuso deve produrre zero risultati e non l'articolo sbagliato.
I filtri operano su campi dichiarati filtrabili, con valori esatti, operatori di confronto e condizioni combinabili. A differenza della ricerca testuale, un filtro su un campo strutturato è una selezione deterministica: o il valore c'è o non c'è.
Le faccette sono la conseguenza naturale. A ogni interrogazione Meilisearch può restituire la distribuzione dei valori, cioè quanti risultati hanno ciascun colore, ciascuna taglia, ciascuna fascia di prezzo. Non serve una query aggiuntiva: arriva nella stessa risposta.
Gli ordinamenti multipli funzionano allo stesso modo, dichiarando i campi come ordinabili.
Sinonimi e parole da ignorare: perché contano più di quanto sembri
Sono due liste in un pannello di configurazione, e su una lingua diversa dall'inglese fanno una differenza sproporzionata rispetto allo sforzo.
Le parole da ignorare, o stop word, escludono dalla ricerca i termini privi di valore discriminante: articoli, preposizioni, riempitivi. Diventano decisive quando il motore è impostato per pretendere tutte le parole dell'interrogazione, perché senza quella lista una preposizione diventa un termine obbligatorio che nessun documento contiene.
I sinonimi dichiarano equivalenze fra termini. Servono ogni volta che il vocabolario di chi cerca non coincide con quello di chi ha scritto il catalogo, che è la norma e non l'eccezione.
Nessuna delle due liste arriva precompilata per l'italiano. Vanno scritte, e vanno scritte guardando il proprio catalogo.
La ricerca semantica in locale, senza servizi esterni
Esiste una classe di domande a cui nessun motore a parole chiave può rispondere, perché i termini usati non compaiono in nessun documento. «Qualcosa di caldo per l'inverno» non trova un cappotto in lana se la parola «caldo» non è scritta nella scheda.
La ricerca semantica risolve questo: ogni documento e ogni domanda vengono proiettati in uno spazio numerico dove le cose che significano cose simili finiscono vicine, e l'ordinamento avviene per prossimità. Meilisearch supporta anche la modalità ibrida, che mescola corrispondenza testuale e vicinanza di significato con un rapporto regolabile.
L'aspetto poco noto è che non è richiesto alcun servizio esterno. Il motore di inferenza è incorporato nell'eseguibile, ed è la ragione per cui il binario pesa oltre trecento megabyte: Meilisearch può scaricare ed eseguire il modello in locale, senza chiavi API, senza costo per interrogazione e senza che alcun dato lasci la macchina.
Le alternative restano disponibili per chi le preferisce: OpenAI, un server Ollama proprio, una qualsiasi API HTTP, oppure vettori calcolati a monte e trasmessi già pronti.Quanto serve per farlo girare
Meilisearch è notoriamente frugale rispetto ad alternative come Elasticsearch, che richiede una macchina virtuale Java e un dimensionamento sensibilmente maggiore. Per cataloghi nell'ordine delle decine di migliaia di documenti è ragionevole partire da una macchina con un core e due gigabyte di memoria.
Due avvertenze operative valgono più di qualunque stima.
La prima riguarda l'ingestione: Meilisearch è ottimizzato per ricevere documenti a lotti. Inviarli uno per richiesta HTTP fa pagare a ogni invio l'intero costo fisso dell'operazione, e la differenza sui tempi di indicizzazione è di ordini di grandezza. È una delle cause più frequenti di lentezza apparente.
La seconda riguarda la ricerca semantica: generare le rappresentazioni vettoriali significa eseguire una rete neurale una volta per documento, con un picco di memoria. Su una macchina priva di spazio di swap il sistema operativo può terminare il processo. I dati non si perdono, perché lo storage resiste agli arresti bruschi, ma il servizio resta indisponibile. Predisporre lo swap prima di attivare la funzione costa cinque minuti.
Gli errori di configurazione più frequenti
Il modello di embedding predefinito è addestrato su corpus inglese. Attivando la ricerca semantica senza specificare nulla, su un catalogo in italiano si ottengono rappresentazioni che non distinguono i documenti, e nessun messaggio lo segnala.
I modelli non predefiniti richiedono l'identificativo esplicito di revisione. Indicando soltanto il nome del modello, l'operazione fallisce con un errore di recupero risorsa che non indica la causa.
Conta la classe di addestramento del modello e non solo la lingua. I modelli addestrati a confrontare frasi simili fra loro danno risultati deludenti dove servono modelli addestrati a rispondere a una domanda breve con un documento lungo.
Infine, alcuni modelli documentano prefissi da anteporre a domande e documenti. Applicati alla lettera possono degradare i risultati e, in modalità ibrida, compromettere la componente testuale, che si mette a cercare il prefisso come se fosse una parola.
Quando Meilisearch non è la scelta giusta
Meilisearch è pensato per la ricerca su documenti e per l'esperienza di ricerca istantanea. Non è un sistema di analisi di log, non è un motore di aggregazioni statistiche complesse e non sostituisce un data warehouse. Per quegli usi Elasticsearch resta più indicato, al prezzo di una complessità operativa superiore.
Non è nemmeno la risposta a un catalogo di poche centinaia di elementi senza attributi, dove la ricerca del CMS può bastare.
Resta uno strumento, e come tutti gli strumenti rende in proporzione a come viene configurato. Le decisioni che contano non riguardano il motore, ma i dati che gli si danno da leggere e l'ordine in cui gli si dice di guardarli.