Desenvolupament d'Aplicacions

Full text search amb Laravel

Full Text Search ens permet buscar una cadena de text a una aplicació web aconseguint un conjunt d'elements que continguin aquest text.

Full text search amb Laravel

Què és Full Text Search?

És molt comú poder buscar una cadena de text a una aplicació com, per exemple, a una botiga online. Hem de ser capaços de buscar un text i que el resultat sigui un conjunt de productes que continguin aquest text al títol, a la descripció o a les especificacions.

A Laravel per realitzar aquesta consulta fariem:

$productes->where('titol', 'like', '%text%')->orWhere('descripcio', 'like', '%text%')

Amb mysql s'executaria de la següent manera:

select * from productes where titol like '%text%' or descripcio like '%text%' or...

El problema d'aquesta cerca és que li estem dient que 'text'  pot estar al principi, al mig o al final de cada camp que consultem, el que comporta una gran càrrega del servidor. Estem parlant de molts segons i a ningú li agrada esperar.

Aquesta espera s'incrementa a l'afegir registres a la taula que volem, passant d'un parell de segons per a pocs registres (uns cent), a minuts quan parlem de millons. Això s'ha de tenir en compte, ja que s'ha de valorar la possibilitat de que la nostra botiga tingui pocs productes. Si és així, amb aquest codi ja complim la nostra comesa i no hi ha necessitat d'afegir-li res al servidor o haver de pagar per un servei extern. Però si estem creant un projcte que necessita un tamany superior com, per exemple, una botiga que integri productes de molts proveïdors, podem acabar parlant fàcilment de milions de productes. Aquí la cerca anterior passa del parell de segons de la botiga petita a un parell de minuts. Ningú espera 2 minuts.

Així doncs, tenim un milió de productes, volem buscar per text a qualsevol dels seus camps i no volem esperar. Toca canviar el nostre sistema de cerca. Laravel 5.3 va venir amb un parell de regals sota el braç. El meu preferit és, sense dubte, les Notificacions, però aquí no ens serveixen. Seguim buscant i veiem que un altre d'aquests regals és Laravel Scout, que ens podrà ajudar millor en aquesta tasca.

Realitzem una petició 'composer' al nostre Laravel/Scout, li indiquem als productes que són "Searchables" i els importem a Scout amb:

php artisan scout:import App\Producte

I el següent pas serà:

Producte::search('text')

La màgia ocorre i tenim el nostre resultat en 200ms. 

També existeix la opció de connectar Scout amb serveis com Algolia, un servei de pagament on 1M de registres ens constaria aproximadament 250$/mes, una xifra que no està a l'abast de tothom. Això també succeix amb els servidors. Si la teva app necessita un servidor potent perquè té molta càrrega i no es pot optimitzar més, has de passar per una inversió d'aquest tipus.

També pots optar per instal·lar el teu propi servei a algun dels teus servidors, en aquest cas ElasticSearch.

Utilitzis Algolia o ElasticSearch, la gràcia d'Scout està en que és invisible en el codi, ell s'encarrega de transformar el teu 'search' al codi que necessiten aquests serveis. Això permet començar pel pla gratuït d'Algolia (10k registres, mostrant el seu logo) a Elastic una vegada que superes aquest límit sense haver de fer grans canvis al teu codi.

Com la majoria de característiques de Laravel simplement funciona i ell mateix s'encarrega de la part més tediosa.

Comparteix aquest article

Articles Relacionats