Mastico, la nuova gemma di Cantiere Creativo!

Matteo Manzo
Cantiere Creativo
Published in
4 min readApr 9, 2018

--

Quando si tratta di implementare un sistema di ricerca nei nostri progetti, quasi sempre abbiamo a che fare con situazioni complesse: potremmo aver bisogno di ricerche incrociate su più campi, in più lingue e magari con l’esigenza di fare delle full-text search.

In questo caso, la soluzione che adottiamo più spesso si chiama Elasticsearch.

Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you to store, search, and analyze big volumes of data quickly and in near real time. It is generally used as the underlying engine/technology that powers applications that have complex search features and requirements.

ES è un sistema potente e complesso che riesce a maneggiare grandi quantità di dati. Ovviamente non è una soluzione plug-and-play quindi raramente lo utilizziamo da sé, infatti ci sono delle gemme che ci aiutano a bootstrapare le funzionalità di cui abbiamo bisogno.

Una di queste gemme si chiama Chewy.

Cos’è Chewy?

Chewy è un framework ad alto livello basato sul client elasticsearch-ruby.

Chewy semplifica molto il modo di creare e gestire un indice, ovvero una collezione di modelli che condividono caratteristiche simili, il quale poi possiamo interrogare ed avere i risultati della nostra ricerca.

Prendiamo come esempio una parte del sistema di ricerca che abbiamo implementato nel sito degli Uffizi:

Se volessimo cercare la Venere di Botticelli potremmo tranquillamente cercare “venere”:

Come vediamo, riceviamo un solo risultato, quello esatto, ma cosa succederebbe se ci fossero più quadri con “venere” nel titolo e volessimo solo il dipinto del Botticelli?

In questo caso possiamo concatenare più query:

Il risultato rimane lo stesso, ma ci stiamo già accorgendo che se volessimo fare delle query molto più specifiche per filtrare maggiormente i risultati arriveremo a scrivere diverse righe di codice.

E non c’è un modo più intelligente per farlo? Sì. ES fornisce multi_match il quale permette di fare più ricerche su più campi, ma vediamo come si comporta:

Mentre prima volevamo trovare la Venere, e soltanto la Venere di Botticelli, adesso abbiamo tutti i dipinti che includono “venere” nel titolo e tutti gli autori che contengono “Botticelli” nel nome. È successo il contrario: abbiamo un OR invece di un AND.

Sicuramente ci saranno decine di modi per raggiungere il nostro obiettivo con Chewy, e per questo abbiamo deciso di creare un helper che ci possa rendere la vita più facile tutte le volte che utilizzeremo la gemma di Toptal.

Ecco a voi Mastico!

Mastico ci aiuta a semplificare l’interfaccia per la costruzione di queries e ci fornisce una configurazione base di Chewy di modo che, una volta installato, possiamo iniziare subito a fare le nostre ricerche!

Questa prima query è sì più lunga di quella di Chewy, ma il nostro scopo è incrociare più attributi, e quindi proviamo a vedere come dovrebbe essere la query che ci ritorna solo la Venere del Botticelli:

Abbiamo ottenuto ciò che volevamo e la query è appena più lunga di quella precedente, ma la cosa ancora migliore è che basterà aggiungere un altro campo nell’array di fields per ricercare dentro altri attributi.

Vediamo nel dettaglio cosa viene eseguito quando lanciamo questo comando, ovvero quello che avremmo dovuto fare a mano con ES: https://gist.github.com/mttmanzo/a7ffb82c312a3b3f4d027fb681e49ef6.

Una volta passati fields e query, Mastico inizia a concatenare la ricerca con altri valori come il tipo di ricerca (:word, :prefix, :infix e :fuzzy) e il boost, ovvero quanto vogliamo mettere in risalto quella parola.

Questo è sufficiente per farci iniziare ad implementare ricerche anche complesse in maniera semplice e veloce. Ma cosa succederebbe se sbagliassi a scrivere la parola?

Mastico gestisce questa eventualità in automatico con il tipo fuzzy, quindi se cercassimo “Botticello” troveremmo comunque le opere di Botticelli.

Bello, ma se voglio filtrare le “stop-word”? C’è una soluzione anche a questo, infatti basta passare l’attributo word_weight alla query:

I valori restituiti rappresentano il boost, il quale può essere utilizzato anche per enfatizzare la ricerca su altre parole chiave.

Tutte queste opzioni posso sembrare complesse da abbinare, ma in realtà e possibile concatenarle in un semplice hash:

Le feature che abbiamo appena visto ci sono di enorme aiuto e ci aiutano giornalmente in molti dei nostri progetti, ma non aspettiamo altro che il feedback da utilizzatori esterni e sopratutto idee per migliorare Mastico! Chi volesse contribuire, ovviamente, può farlo qua https://github.com/cantierecreativo/mastico.

Originally published at www.cantierecreativo.net on April 9, 2018.

--

--