Come implementare la ricerca full-text in un progetto Laravel

Al giorno d’oggi, l’implementazione della ricerca full-text è una delle parti più importanti dello sviluppo di applicazioni. Nelle applicazioni che fanno molto affidamento sulla funzionalità di ricerca, come servizi musicali o negozi online, la configurazione e la personalizzazione della classificazione delle risposte è vitale. Per capire meglio perché è necessario implementare una soluzione del genere, consideriamo i problemi in sua assenza. Il framework PHP Laravel, nella sua magnifica completezza offre per la ricerca uno strumento eccezionale.

Miglioramento della funzionalità di ricerca

Spesso gli sviluppatori hanno il compito di migliorare la ricerca in un’applicazione e, in molti casi, viene dedicato molto tempo a mettere insieme una serie chiara di perfezionamenti per il progetto.

Le attività comuni per migliorare la ricerca potrebbero includere quanto segue:

  • Accelerare le prestazioni di ricerca
  • Aggiungere tolleranza agli errori
  • Aggiungere la possibilità di cercare oltre il nome dell’articolo
  • Aggiungere la possibilità di cercare per parole non necessariamente nello stesso ordine
  • Aggiungere la possibilità di cercare altre forme di parole da una query
  • Aggiungere la possibilità di gestire regole di ricerca per la stessa parola con valori diversi

Criteri di valutazione

I criteri principali per valutare le prestazioni della ricerca possono essere definiti come velocità di risposta, completezza e accuratezza. Mentre i tassi di risposta possono essere facilmente misurati e valutati, gli altri due sono un po’ più difficili da calcolare.

La completezza della ricerca è il risultato della divisione del numero di elementi restituiti per il numero di elementi corrispondenti. Quando si risolve un problema del primo tipo, con l’esclusione degli articoli corrispondenti, spesso viene risolto anche il problema di una query errata con un errore o un errore di battitura.

La precisione della ricerca è il risultato della divisione del numero di elementi corrispondenti nella risposta per il numero di elementi nella risposta. Quegli elementi che sono stati inclusi nella risposta, ma che non avrebbero dovuto figurare, sono chiamati errori del secondo tipo.

Di conseguenza, abbiamo bisogno della risposta più rapida, con le più alte percentuali di completezza e accuratezza della ricerca. L’equilibrio tra questi elementi è unico per ogni progetto. Proviamo a considerare le possibili soluzioni a questo problema senza implementare la ricerca full-text.

Tentativo di soluzione tramite SQL LIKE

La soluzione più semplice potrebbe essere l’uso di LIKE in SQL.Tuttavia, questa non è la soluzione ottimale e se i record nella tabella dei post sono più di 1000, anche considerando che gli indici siano correttamente impostati, le query verranno comunque elaborate sull’orlo del timeout.

Inoltre, questo tipo di query è appropriato esclusivamente per affrontare un compito specifico, in cui tutti i campi vengono utilizzati nella ricerca. Tuttavia, altri compiti, in particolare riorganizzare l’ordine delle parole all’interno della query, dare priorità agli elementi e migliorare la velocità di ricerca della query, rimangono in gran parte irrisolti.

Ricerca full-text in PostgreSQL/MySQL

La seconda soluzione con il set di strumenti esistente nell’applicazione può consistere nell’utilizzare le funzionalità di ricerca full-text di PostgreSQL e MySQL. In questo caso, la query avrà la seguente forma: SELECT … MATCH (campo) CONTRO (‘parola’).

La decisione di utilizzare SQL ci garantisce il 100% di precisione e completezza della ricerca, ma presenta anche numerosi svantaggi. Tra questi ci sono la necessità di una costante personalizzazione del database e le limitazioni sulla tipologia dei campi e la mancanza di classificazione, nonché il costo finale di tale soluzione in termini di risorse macchina che producono oltretutto un’insostenibile lentezza nell’esecuzione della query.

Laravel Scout

Per risolvere tutti i problemi descritti sino ad ora esistono servizi di terze parti che producono rapidamente ricerche full-text e risolvono problemi con la tokenizzazione e l’analisi morfologica. Laravel Scout ti consente di lavorare con molti di questi servizi e fornisce un’interfaccia unificata per lavorare con la ricerca, oltre a collegare la ricerca di entità con i modelli Laravel.

Di seguito è riportato un elenco di servizi che funzionano con la ricerca full-text di Laravel Scout

 

Il principio di lavorare con il full-text in Laravel non differisce molto a seconda del driver. Facendo riferimento ad Algolia, Laravel Scout semplifica l’aggiunta di dati all’indice Algolia e rende altrettanto facile recuperarli effettuando la ricerca in molti campi. Naturalmente, quando si sceglie un fornitore, il progetto acquisirà una dipendenza che deve essere tenuta presente. Laravel Scout contribuirà a ridurre la dipendenza, grazie alle sue interfacce.