Solr: il potente server di ricerca di Apache

Solr (pronunciato Solar) è un sottoprogetto open source basato sul software libero Lucene di Apache. Solr si basa su Lucene Core ed è scritto in Java. Come server di ricerca, Apache Solr è uno dei più popolari strumenti di integrazione dei motori di ricerca verticali. I vantaggi di Solr includono l’ampia gamma di funzioni (che include anche, ad esempio, la sfaccettatura dei risultati di ricerca) e l’indicizzazione accelerata. Funziona anche su contenitori server come Apache Tomcat.

In primo luogo spiegheremo come funziona Apache Solr e poi, con il tutorial di Solr, a cosa fare attenzione quando si utilizza il software per la prima volta.

L’emergere di Apache Solr

Il server di ricerca Solr è stato costruito sulla base di Lucene. Apache Lucene Core è stato sviluppato dal software designer Doug Cutting nel 1997. Inizialmente veniva offerto tramite il servizio di filehosting SourceForge.

Nel 1999 la Apache Software Foundation ha lanciato il Jakarta Project per supportare e guidare lo sviluppo di un software Java gratuito. Nel 2001 anche Lucene è diventato parte di questo progetto ed è stato scritto anch’esso in Java. Dal 2005 appartiene ai progetti principali di Apache e funziona con una licenza Apache gratuita. A partire da Lucene sono emersi alcuni sottoprogetti come Lucy (Lucene, ma scritto in C) e Lucene.NET (Lucene in C #). Anche il popolare server di ricerca Elasticsearch è basato, come Solr, su Lucene.

Sulla base di Lucene 2004 è emerso anche Solr: a quel tempo, tuttavia, il servlet era ancora chiamato Solar e distribuito da CNET Networks. “Solar” stava per “Search on Lucene and Resin”. Nel 2006 CNET ha ceduto il progetto alla Apache Foundation, dove ha attraversato un altro periodo di sviluppo. Quando Solr fu aperto al pubblico nel 2007 come progetto separato attirò rapidamente su di sé l’attenzione della community. Nel 2010 la community Apache ha integrato il servlet nel progetto Lucene. Questo sviluppo congiunto garantisce una buona compatibilità. Il pacchetto è completato da Solr Cloud e Solr Parser Tika.

Definizione

Apache Solr è un server di ricerca per progetti web basati su Java indipendentemente dalla piattaforma. Il progetto open source si basa sulla libreria Java Lucene e integra automaticamente i documenti in tempo reale e forma cluster dinamici. Solr è compatibile con PHP, Python, XML e JSON. Il servlet ha un’interfaccia utente web e i comandi vengono scambiati in http. Solr consente agli utenti di seguire una sofisticata ricerca full-text in documenti RTF (Rich Text Format). È particolarmente adatto per i motori di ricerca verticali su siti web statici. L’estensione SolrCloud consente core aggiuntivi e classificazione estesa dei frammenti.

Introduzione a Solr: spiegazione dei concetti di base

Apache Solr è integrato come servlet in Lucene. Spieghiamo brevemente come funziona in qualità di complemento della libreria del software Lucene. Oltre a questo utilizzo, molti siti web si servono di Solr come base per il loro motore di ricerca verticale (Netflix e Ebay sono esempi noti).

Che cos’è Apache Lucene?

Il software gratuito Lucene è una libreria Java open source gratuita utilizzabile indipendentemente dalla piattaforma. Lucene è nota come libreria NoSQL scalabile e potente. Il software di archiviazione è particolarmente adatto per i motori di ricerca di Internet, sia per la ricerca nel World Wide Web sia per quella a livello di dominio e di richieste locali.

Fatto

Lucene Core è una libreria software (o anche semplicemente “libreria” o libreria di componenti) per il linguaggio di programmazione Java. Le biblioteche sono semplicemente una raccolta ordinata di sottoprogrammi. Gli sviluppatori utilizzano queste raccolte per collegare i programmi ai moduli ausiliari tramite un’interfaccia. Mentre un programma è in esecuzione, può accedere al componente richiesto nella libreria.

Poiché la libreria divide i documenti in campi di testo e li classifica in modo logico, la ricerca full-text tramite Lucene funziona molto precisamente. Lucene è in grado di trovare anche corrispondenze rilevanti per testi/documenti simili. Per questo motivo la libreria è adatta anche per pagine di recensioni come Yelp. Finché riconosce il testo, il formato (testo normale, PDF, HTML o altro) non ha importanza. Perché invece di indicizzare i file, Lucene lavora con testo e metadati. Tuttavia i file devono essere letti dalla libreria.

A tale scopo il team di Lucene ha sviluppato il progetto Apache Tika, uno strumento utile per l’analisi del testo, la traduzione e l’indicizzazione. Tika legge testo e metadati da oltre mille tipi di file, quindi estrae il testo e lo prepara a ulteriori modifiche. Lo strumento consiste di un parser e un rilevatore: il parser analizza i testi e struttura il contenuto in una gerarchia ordinata, mentre il rilevatore digita il contenuto. Ad esempio, riconosce il tipo di file e il tipo di contenuto dai metadati.

Caratteristiche e funzioni più importanti di Lucene:

  • Indicizzazione rapida, sia in fasi che in lotti (secondo i dati forniti da Lucene stesso fino a 150 GB all’ora)
  • Uso economico della RAM
  • Scritto in Java, quindi multipiattaforma (le varianti nei linguaggi di programmazione alternativi sono Apache Lucy e Lucene.NET)
  • Interfaccia per plug-in
  • Ricerca di campi di testo (categorie come contenuto, titolo, autore, parola chiave), anche di diversi contemporaneamente
  • Ordine per campi di testo
  • Elenco per somiglianza/rilevanza dei risultati di ricerca

Lucene suddivide i documenti in campi di testo come titolo (“title”), autore (“author”) e corpo del testo (“text”). All’interno di questi campi il software fa una ricerca con il query parser (analizzatore di richieste), considerato particolarmente efficiente per le ricerche con inserimento manuale del testo. La sintassi semplice consiste in un termine di ricerca e un modifier. I termini di ricerca possono essere singole parole o gruppi di parole. È possibile modificarli con un modifier o combinare più termini con variabili booleane per formare una query complessa. Nel tutorial di Apache per la sintassi dei query parser trovate i comandi precisi.

Lucene supporta anche ricerche fuzzy basate sulla distanza di Levenshtein. Quest’ultima rileva il numero di modifiche ai caratteri (cioè sostituisci, inserisci o cancella) per passare da una stringa significativa a un’altra. Ad esempio “mare” (sostituire “r” con “l”) ha una distanza di 1 da “male”, poiché è stata necessaria una sola operazione di conversione.

Potete impostare voi stessi un valore che determini l’ampiezza delle deviazioni dal termine di ricerca originale per far sì che il rispettivo termine sia ancora considerato nei risultati di ricerca. Questo valore è compreso tra 0 e 1: più è vicino a 1, più il risultato della ricerca deve assomigliare alla parola sorgente. Se non inserite alcun valore, esso verrà automaticamente impostato su 0,5. Il comando corrispondente è questo:

mare~

Se volete stabilire voi un valore preciso (0,9 nell‘esempio), inseritelo come segue nel comando:

mare~0.9

Allo stesso modo, lo strumento di ricerca ambientale vi consente di cercare parole e imposta anche la distanza tra i termini di ricerca nel testo. Ad esempio se state cercando la frase “Alice nelle città” potete impostare le parole “Alice” e “città” in un raggio di tre parole:

"alice città"~3

Che cos’è un motore di ricerca verticale?

Lucene abilita le ricerche sul World Wide Web e all’interno dei domini. I motori di ricerca che coprono una vasta gamma di pagine sono chiamati motori di ricerca orizzontali. Essi includono i ben noti provider Google, Bing, Yahoo, ma anche DuckDuckGo e Startpage. Un motore di ricerca verticale, d’altra parte, è limitato a un dominio, un argomento specifico o un pubblico di destinazione. Un motore di ricerca specifico del dominio aiuta i visitatori del vostro sito web a trovare su di esso testi o offerte specifiche. Esempi di motori di ricerca tematici sono portali di consigli come TripAdvisor o Yelp, ma anche motori di ricerca per il lavoro. I motori di ricerca per specifici target si rivolgono, ad esempio, a bambini e adolescenti, o anche a scienziati che ricercano le fonti.

I crawler focalizzati (al posto dei web crawler) aiutano i motori di ricerca verticali a trovare risultati più accurati. Una biblioteca come Lucene, che divide il proprio indice in classi per principi di tassonomia e le collega in modo logico per ontologia, rende possibile questa esatta ricerca a tutto il testo. I motori di ricerca verticali utilizzano anche filtri con corrispondenza tematica che limitano il numero dei risultati.

Fatto

Ontologia e tassonomia sono concetti che nell’ambito dell’informatica sono importanti per l’archiviazione mirata. La tassonomia si occupa della divisione dei termini in classi. Questo li divide in una gerarchia simile a un diagramma ad albero. Con ontologia, in informatica si descrive il modo in cui si relazionano logicamente i concetti. I gruppi concettuali si riuniscono in gruppi che segnalano una stretta relazione. Inoltre, i relativi gruppi concettuali sono collegati tra loro, creando una rete di relazioni.

L’indice di Lucene è un archivio pratico e scalabile per ricerche veloci, tuttavia ci sono alcuni passaggi essenziali che dovete ripetere frequentemente ma che non avvengono automaticamente. Infine, per una ricerca verticale è necessario un indice ampiamente ramificato. È qui che entra in gioco Apache Solr. Il server di ricerca integra le funzioni della libreria. E Solr può essere impostato rapidamente e facilmente con i comandi giusti, anche se siete neofiti nel mondo di Java. Il servlet offre molti strumenti pratici che vi consentono di configurare rapidamente un motore di ricerca verticale per il vostro sito web e adattarlo alle esigenze dei vostri visitatori.

Che cos’è Solr? Funzionamento del server di ricerca

Ora che disponete di informazioni di base sulla fondazione Lucene e lo scopo di Solr, spieghiamo come funziona il motore di ricerca, in che modo espande Lucene e come lavora con esso.

Solr: elementi di base

Solr è scritto in Java, così potete utilizzare il servlet indipendentemente dalla piattaforma. I comandi sono generalmente scritti in HTTP (Hypertext Transfer Protocol), mentre si utilizza XML (Extensible Markup Language) per i file da memorizzare. Attraverso un’API Apache Solr fornisce anche a sviluppatori Python e Ruby il loro linguaggio di programmazione familiare. Per coloro che utilizzano normalmente la JavaScript Object Notation (abbreviato in JSON), ElasticSearch fornisce l’ambiente ottimale. Solr può anche lavorare con questo formato tramite un’API.

Sebbene il server di ricerca sia basato su Lucene e si integri perfettamente nella sua architettura, Solr funziona anche da solo. È compatibile con server container come Apache Tomcat.

Indicizzazione per risultati di ricerca accurati – in frazioni di secondo

Strutturalmente il servlet si basa su un file invertito (in inglese: inverted index). A tal fine Solr utilizza la biblioteca di Lucene. I file invertiti sono sottospecie dell’indice del database e dovrebbero accelerare la richiesta di informazioni. All’interno della libreria l’indice memorizza il contenuto che può consistere di parole o numeri. Se un utente cerca contenuti specifici su un sito web, di solito inserisce uno o due termini di ricerca pertinenti al tema. Invece di eseguire la scansione dell’intero sito web per queste parole con i crawler, Solr utilizza la libreria.

Essa indicizza tutte le parole chiave importanti quasi in tempo reale e le collega ai documenti sul sito web che contengono le parole ricercate. La ricerca passa semplicemente attraverso l’indice per trovare un termine. L’elenco dei risultati mostra tutti i documenti che, secondo l’indice, contengono questa parola almeno una volta. Questo tipo di ricerca corrisponde alla ricerca analogica all’interno di un libro di testo: se cercate una parola chiave potete andare alla fine del libro, dove si trova l’elenco dei concetti principali e delle pagine nelle quali compare quella parola. Allo stesso modo la ricerca web verticale mostra un elenco di risultati con i collegamenti ai rispettivi documenti.

Affinché questo processo funzioni senza intoppi, in teoria bisognerebbe inserire tutte le parole chiave e i metadati (ad esempio autore o anno di pubblicazione) nella libreria ogni qualvolta si inserisce un nuovo documento nel portfolio del sito web. Di conseguenza il lavoro in back end per Lucene è talvolta un po’ macchinoso. Ma con Solr questi passaggi possono essere automatizzati.

Rilevanza e filtri

Apache Solr utilizza l’ontologia e la tassonomia di Lucene per produrre risultati di ricerca estremamente accurati. Le variabili booleane e i metacaratteri, già noti da Lucene, sono qui di grande aiuto. Solr aggiunge una cache di livello superiore a quella di Lucene. Ciò significa che il servlet ricorda le query più frequenti, anche se consistono in variabili complesse, e ottimizza quindi la velocità di ricerca.

Se volete tenere gli utenti sul vostro sito web, dovreste offrire loro una buona user experience. Ciò include in particolare la capacità di fare offerte giuste. Ad esempio se i vostri visitatori sono alla ricerca di informazioni sull’allevamento di polli, i testi relativi all’allevamento e alle abitudini alimentari dei polli dovrebbero apparire tra i primi risultati di ricerca, in cima alla lista. Le ricette con pollo o anche i film sui polli, invece non dovrebbero far parte dei risultati di ricerca, o quantomeno dovrebbero apparire in fondo alla lista.

Indipendentemente dal fatto che gli utenti stiano cercando un termine specifico o che debbano essere loro mostrati interessanti proposte di temi attinenti con link interni alla fine di un articolo, rimane il fatto che la rilevanza dei risultati è la cosa più importante. E per fare in modo che a chi cerca vengano mostrati soltanto i risultati di ricerca per lui rilevanti, Solr utilizza il tf-idf.

Fatto

Il termine Term Frequency-Inverse Document Frequency, o tf-idf (in italiano: frequenza del termine per frequenza inversa del documento) indica una statistica numerica. La densità del termine di ricerca in un documento (ovvero il numero di volte in cui un singolo termine appare nel testo) viene confrontata con il numero di documenti dell’intero pool di ricerca che contiene il termine. In questo modo si può vedere se un termine di ricerca si verifica più frequentemente in un documento rispetto alla totalità dei testi.

Solr: le funzioni più importanti

Apache Solr raccoglie e indicizza i dati quasi in tempo reale grazie a Lucene Core. In questo caso i dati indicano i documenti. Sia nella ricerca sia nell’indice il documento è l’unità di misura decisiva. L’indice è composto da diversi documenti che a propria volta sono composti da diversi campi di testo. Nel database i documenti si trovano nelle righe della tabella, mentre i campi sono nelle colonne.

Accoppiato ad Apache Zookeper attraverso un’API, Solr dispone di un punto di appoggio che fornisce la sincronizzazione, i registri dei nomi e la distribuzione della configurazione. Ciò include, ad esempio, un algoritmo ad anello che assegna ai processi un coordinatore (detto leader) all’interno di un sistema distribuito. Zookeeper, un trouble shooter ben collaudato, riavvia i processi anche quando i token vanno persi e trova nodi (computer nel sistema) utilizzando Node Discovery. Tutte queste funzionalità assicurano che il vostro progetto rimanga sempre liberamente scalabile.

Ciò significa anche che il motore di ricerca funzioni anche nelle condizioni più difficili. Come accennato in precedenza, anche i siti web ad alta intensità di traffico che archiviano e gestiscono enormi quantità di dati ogni giorno utilizzano Apache Solr.

Se un singolo server Solr non è sufficiente, si possono semplicemente collegare più server tramite il cloud Solr. Quindi potete frammentare i vostri dati orizzontalmente, operazione chiamata anche sharding. Per fare ciò dividete la vostra libreria in frammenti logicamente collegati, in modo da espandere la vostra biblioteca oltre lo spazio disponibile. Apache consiglia inoltre di caricare più copie della libreria su server diversi per aumentare il fattore di replicazione. Se infatti arrivano nello stesso istante molte richieste, esse verranno distribuite su diversi server.

La ricerca full-text, offerta già da Lucene, viene estesa con Solr a funzioni di ricerca aggiuntive, che includono:

  • Adattamento dei termini anche per gruppi di parole: il sistema rileva errori di ortografia nell’input di ricerca e fornisce risultati per un’alternativa corretta.
  • Join: una combinazione tra prodotto cartesiano (vengono considerati più termini durante la ricerca in qualsiasi ordine) e selezione (vengono visualizzati solo i termini che soddisfano una determinata condizione), in pratica una sintassi booleana complessa di variabili.
  • Raggruppamento di termini correlati.
  • Classificazione sfaccettata: il sistema organizza ogni singolo elemento informativo in base a diverse dimensioni. Ad esempio, associa un testo a parole chiave come nome dell’autore, lingua e lunghezza del testo. Inoltre ci sono gli argomenti trattati nel testo, nonché una classificazione temporale.
  • Ricerca con metacaratteri: un segno sta per un elemento indefinito o addirittura per più elementi in una stringa? Se si tratta di un solo elemento infinito, si utilizza “?”, se invece sono molti si utilizza “*”. Ad esempio è possibile inserire un frammento di parola più un metacarattere (ad esempio insegn*): in questo modo l’elenco dei risultati includerà tutti i termini che hanno il frammento di parola data come radice (ad esempio insegnamento, insegnante, insegnare). In questo modo gli utenti ricevono risultati della ricerca rilevanti su questo argomento. La necessaria rilevanza deriva dalla limitazione dell’argomento nella vostra libreria o da ulteriori delimitazioni di ricerca. Se invece un utente cerca ad esempio “ma?e” otterrà i risultati come “male”, “mare”, ecc. Tuttavia la ricerca non include termini come “mareggiata”, “maremoto” o simili, perché il punto di domanda indica una sola lettera.
  • Rileva il testo in molti formati, da Microsoft Word a editor di testo in PDF e contenuti multimediali indicizzati.
  • Riconosce diverse lingue.

Inoltre il servlet può incorporare più nuclei (inglese: core) che sono costituiti da indici Lucene. Quindi questi nuclei raccolgono tutte le informazioni in una libreria, dove si possono trovare anche i file e gli schemi di configurazione. In questo modo impostate il comportamento di Apache Solr. Se si desidera utilizzare le estensioni, è sufficiente integrare i propri script o plug-in dai post della community ai file di configurazione.

Vantaggi

Svantaggi

Estende Lucene con pratiche feature

Indicizzazione automatica in tempo reale

Ricerca full-text

Sfaccettatura e raggruppamento di parole chiave

Pieno controllo sui frammenti

Alleggerisce il ridimensionamento orizzontale dei server di ricerca

Facile da integrare nel proprio sito web

Poco adatto per dati e oggetti dinamici

L’aggiunta di core e la divisione di frammenti è possibile solo manualmente

La cache globale può costare tempo e spazio rispetto alla cache segmentata.

Tutorial: scaricare e configurare Apache Solr

I requisiti di sistema per Solr non sono particolarmente elevati. Tutto ciò di cui avete bisogno è un Java SE Runtime Environment a partire dalla versione 1.9.0. Gli sviluppatori hanno testato il servlet su Linux/Unix, macOS e Windows in diverse versioni. Basta scaricare l’apposito pacchetto di installazione ed estrarre il file .zip (pacchetto Windows) o il file .tgz (pacchetti Unix, Linux OSX) in una directory a vostra scelta.

Tutorial Solr, passo 1: download e avvio

1. Visitate la pagina del progetto Solr nel progetto principale Apache Lucene. Nella parte superiore della finestra viene visualizzata la barra del menu. Alla voce “Features” Apache vi informa brevemente sulle funzioni di Solr. Per i tutorial e la documentazione utilizzate la voce “Recources”. Nella sezione “Community”, infine, i partecipanti alla community di Solr vi aiuteranno nel caso abbiate domande. In questa sezione è inoltre possibile contribuire con propri build.

2. Per l’installazione cliccate sul pulsante di download, che vi porterà alla pagina di download con un elenco di mirror download. In cima alla lista dovreste trovare la versione più recente di Solr (7.3 a maggio 2018) di un fornitore testato. In alternativa è possibile scegliere tra i link HTTP e il download FTP. Cliccando su un link, si accede alla pagina mirror del rispettivo provider.

3. Nella figura sopra potete vedere i vari pacchetti di download disponibili per la selezione, in questo caso per Solr versione 7.3.

  • solr-7.3.0-src.tgz è il pacchetto per gli sviluppatori. Contiene il codice sorgente in modo da poter lavorare su di esso al di fuori della community GitHub.
  • solr-7.3.0.tgz è la versione per utenti Mac, Linux o Unix.
  • solr-7.3.0.zip contiene il pacchetto Solr compatibile con Windows.
  • Nella cartella changes/ è possibile trovare la documentazione per la versione corrispondente.

Dopo aver selezionato con un clic la versione più adatta alle vostre esigenze, si aprirà una finestra di download. Salvate il file e una volta completato il download, cliccate sul pulsante di download nel browser o aprite la cartella di download.

4. Estraete il file zip o il file .tgz. Se volete iniziare a familiarizzare con Solr, selezionate una directory dove salvare i file decompressi. Se sapete già in quale misura volete utilizzare Solr, scegliete il server previsto per le attività che intendete svolgere. Oppure costruite un ambiente cloud Solr in cluster se volete scalare verso l’alto (trovate maggiori informazioni sul cloud nel prossimo capitolo).

N.B.

Teoricamente una singola libreria di Lucene può indicizzare circa 2,14 miliardi di documenti. In pratica, però, non si raggiungerà mai questo numero senza che il numero dei documenti inizi a influire sulla performance. Per un numero relativamente elevato di documenti, è quindi consigliabile pianificare fin dall’inizio con un cloud Solr.

5. Nel nostro esempio Linux, Solr è su Home. Stiamo lavorando con Solr 7.3.0. Il codice di questo tutorial è stato testato in Ubuntu. È inoltre possibile utilizzare gli esempi per macOS. In linea di principio i comandi funzionano anche sotto Windows, ma con blackslash invece di normali slash.

Inserite “cd /[percorso sorgente]” nella riga di comando per aprire la cartella Solr e avviare il programma. Nel nostro esempio appare in questo modo:

cd /home/test/Solr/solr-7.3.0
bin/solr start

Il server Solr è ora in esecuzione sulla porta 8983 e il vostro firewall potrebbe chiedervi se lo permettete. Confermatelo.

Se volete fermare Solr, inserite il seguente comando:

bin/solr stop -all

Se Solr funziona, familiarizzate con il software. Con la demo di Solr è possibile avviare il programma in una delle quattro modalità:

  • Solr Cloud (comando: cloud)
  • Gestore dell’importazione dei dati (comando: dih)
  • Senza schema (comando: schemaless)
  • Esempio dettagliato con Kitchen Sink (comando: techproducts)

Gli esempi hanno ciascuno uno schema adattato. Lo si modifica utilizzando l’interfaccia dello schema. Per farlo inserite questo comando (il segnaposto [esempio] sta per una delle parole chiave sopra specificate):

bin/solr -e [esempio]

6. In questo modo Solr funzionerà nella modalità corrispondente. Se si vuole essere sicuri, richiamate lo statusreport:

bin/solr status
Found 1 Solr nodes:
Solr process xxxxx running on port 8983

7. Gli esempi contengono impostazioni di base preconfigurate. Se si inizia senza un esempio, è necessario definire da soli lo schema e il nucleo. Il nucleo memorizza i vostri dati. Senza di esso non è possibile né indicizzare né cercare i file. Per creare un nucleo inserite il seguente comando:

bin/solr create –c <nome_del_nucleo>

8. Apache Solr ha un’interfaccia utente basata sul web. Se il programma è stato avviato con successo, è possibile trovare l’applicazione web Solr Admin nel proprio browser all’indirizzo http://localhost:8983/solr/.

9. Infine fermate Solr con questo comando:

bin/solr stop -all

Tutorial Solr, parte 2: i primi passi

Solr fornisce un semplice strumento di comando. Con il cosiddetto post-tool potete caricare contenuti sul vostro server. Si può trattare di documenti per l’indice così come di configurazioni dello schema. A questo scopo il tool accede alla vostra raccolta. Pertanto è sempre necessario specificare il nucleo o la raccolta prima di lavorarci.

Nel seguente esempio di codice, diamo innanzitutto la forma generale: sostitutite <raccolta> con il nome del vostro nucleo/raccolta. “-c” è il comando “create”, con il quale si creano nuclei o raccolte. Lì si impostano opzioni aggiuntive o si eseguono comandi. Ad esempio è possibile utilizzare “-p” per selezionare una porta e “*.xml” o “*.csv” per caricare tutti i file con il formato appropriato nella propira collezione (righe due e tre). Il comando “-d” elimina i documenti dalla vosra raccolta (riga quattro).

bin/post –c <raccolta> [Optionen] <file|raccolte|url></file|raccolte|url></raccolta>
bin/post –c <raccolta> -p 8983 *.xml</raccolta>
bin/post –c <raccolta> *.csv</raccolta>
bin/post –c <raccolta> -d '<delete><id>42</id><delete>'</delete></delete></raccolta>

Ora conoscete alcuni dei comandi di base per Solr. L’esempio della versione demo di kitchen sink vi mostrerà esattamente come impostare Apache Solr.

1. Avviate Solr con la versione demo. Per la demo kitchen-sink utilizzate il comando techproducts. Inserite nel terminale il seguente testo:

bin/solr –e techproducts

Solr parte di default dalla porta 8983. Il terminale vi dice che sta creando un nuovo nucleo per la vostra raccolta e indicizzando alcuni file di esempio per il vostro catalogo. Nella demo kitchen-sink dovreste vedere quanto segue:

Creating Solr home directory /tmp/solrt/solr-7.3.1/example/techproducts/solr
Starting up Solr on port 8983 using command:
bin/solr start -p 8983 -s "example/techproducts/solr"
Waiting up to 30 seconds to see Solr running on port 8983 [/]
Started Solr server on port 8983 (pid=12281). Happy searching!
Setup new core instance directory:
/tmp/solrt/solr-7.3.1/example/techproducts/solr/techproducts
Creating new core 'techproducts' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=techproducts&instanceDir=techproducts
{"responseHeader":
{"status":0,
"QTime":2060},
"core":"techproducts"}
Indexing tech product example docs from /tmp/solrt/solr-7.4.0/example/exampledocs
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/techproducts/update…
using content-type application/xml...
POSTing file money.xml to [base]
POSTing file manufacturers.xml to [base]
POSTing file hd.xml to [base]
POSTing file sd500.xml to [base]
POSTing file solr.xml to [base]
POSTing file utf8-example.xml to [base]
POSTing file mp500.xml to [base]
POSTing file monitor2.xml to [base]
POSTing file vidcard.xml to [base]
POSTing file ipod_video.xml to [base]
POSTing file monitor.xml to [base]
POSTing file mem.xml to [base]
POSTing file ipod_other.xml to [base]
POSTing file gb18030-example.xml to [base]
14 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update...
Time spent: 0:00:00.486
Solr techproducts example launched successfully. Direct your Web browser to
http://localhost:8983/solr to visit the Solr Admin UI

2. Solr è ora in esecuzione e ha già caricato alcuni file XML nell’indice. Potete lavorarci più tardi. Nel passo successivo dovreste cercare di inserire autonomamente alcuni file nell’index. L’interfaccia utente di Solr admin rende tutto questo abbastanza semplice. Richiamate il server Solr nel vostro browser. Nella nostra demo techproducts Solr specifica già il server e la porta. Quindi inserite nel vostro browser il seguente indirizzo: 'http://localhost:8983/solr/'.

Se avete già definito voi stessi il nome di un server e una porta, utilizzate il seguente modulo e inserite il nome del sereer e il numero di porta nel luogo approprioato: 'http://[Servername]:[Port-number]/solr/'.

Qui controllate la cartella example/exampledocs. Questa cartella contiene i file di esempio e il file post.jar. Selezionate un file che desiderate aggiungere al catalogo e utilizzate post.jar per aggiungere il file. Per il nostro esempio prendiamo more_books.jsonl.

Per fare ciò, inserite nel terminale:

cd example/exampledocs
Java -Dc=techproducts –jar post.jar more_books.jsonl

Se Solr ha caricato con successo il vostro file nell’indice, riceverete il seguente messaggio:

SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/techproducts/update 
POSTing file more_books.jsonl to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update...
Time spent: 0:00:00.162

3. Se state configurando il server di ricerca Apache Solr, è necessario configurare direttamente i file di configurazione e lo schema. Essi sono riportati negli esempi dimostrativi. Se si sta lavorando su un nuovo server, è necessario determinare da sé il set di configurazione e lo schema.

Lo schema (schema.xml) determina il numero, il tipo e la struttura dei campi. Come già accennato, un documento di Lucene è costituito da campi. Questa suddivisione facilita la ricerca mirata a testo integrale. Solr lavora con questi campi. Un certo tipo di campo accetta determinati contenuti (per esempio <date> accetta solo le date nel modulo anno-mese-giorno-ora). Con lo schema determinate quali tipi di campi l’indice riconoscerà successivamente e come li assegna. Se non lo fate, i documenti inseriti nel sistema specificano i tipi di campo. Questo è utile nella fase di test, perché è sufficiente iniziare a riempire il catalogo. In un secondo tempo, tuttavia, tale procedura può portare a problemi.

Questi sono alcuni dei tipi di campo di base in Solr:

  • DateRangeField (indicizza intervalli di tempi e momenti precisi fino al millisecondo)
  • ExternalFileField (estrae valori da una cartella esterna)
  • TextField (campo generale per l’inserimento del testo)
  • BinaryField (per dati binari)
  • CurrencyField indicizza due valori separatamente, ma li presenta all’utente finale come un unico valore. CurrencyField memorizza un valore numerico (per esempio, 4,50) e una valuta (per esempio, €) ciascuno in un campo. L’utente finale vede entrambi i valori insieme (ossia 4,50€).
  • StrField (UTF-8 e stringa Unicode per un piccolo campo. Non vengono analizzati o vengono sostituiti da un token.)

Nel Wiki di Solr potete trovare un elenco dettagliato dei tipi di campo Solr, nonché altri comandi per le impostazioni dello schema.

Per specificare i tipi di campo, richiamate lo schema.xml all’indirizzo "http://localhost:8983/solr/techproducts/schema". Techproducts ha già definito i tipi di campo. Una riga di comando nel file XML descrive in dettaglio le proprietà di un campo utilizzando gli attributi. Secondo la documentazione, Apache Solr permette i seguenti attributi per un campo:

  • field name (non può essere lasciato vuoto. Contiene il nome del campo.)
  • type (qui inserite un tipo di campo valido, anche questo non può essere lasciato vuoto.)
  • indexed (significa “inserito nell’indice”. Se il valore è “true” è possibile cercare il campo o ordinarlo.)
  • stored (indica se un campo è memorizzato, e il suo valore è su “true” significa che il campo può essere richiamato.)
  • multiValued (se un campo contiene più valori per un documento, inserite qui il valore “true”.)
  • default (qui si immette un valore predefinito che appare se non è stato definito alcun valore per un nuovo documento.)
  • compressed (raramente impostato di default su “false”, poiché applicabile solo ai campi comprimibili in gzip. Deve essere impostato su “true” per poter comprimere.)
  • omitNorms (impostato di default su “true”. Salva gli standard per un campo e risparmia in questo modo anche memoria.)
  • termOffsets (richiede più spazio di archiviazione. Memorizza i vettori insieme alle informazioni di offset, cioè le aggiunte di indirizzi di memoria.)
  • termPositions (ha bisogno di più spazio di archiviazione perché memorizza la posizione dei termini insieme al vettore.)
  • termVectors (per impostazione predefinita è impostato su false, se è su “true” memorizza i termini vettoriali.)

È possibile inserire le proprietà del campo direttamente nel file xml dello schema o usare un comando nel terminale. Questo è l’aspetto di un semplice tipo di campo nel file xml dello schema:

<fields>
<field name="name" type="text_general" indexed="true" multivalued=”false” stored="true" />
</fields>

In alternativa è possibile utilizzare nuovamente il terminale di ingresso. Qui e sufficiente inserire un comando Curl, definire le proprietà del campo e inviarlo tramite un’interfaccia dello schema inserendo l’indirizzo del file:

curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field": {"name":"name", "type":"text_general", "multiValued":false, "stored":true}}' http://localhost:8983/solr/techproducts/schema 

4. Dopo aver regolato lo schema, è tocca alla configurazione di Solr. Con essa si definiscono le impostazioni di ricerca. Ecco i componenti importanti:

  • Richiesta dei parametri della cache
  • Gestore della richiesta (anche: request handler)
  • Ubicazione dell’elenco dei dati
  • Componente di ricerca

I parametri di cache della richiesta consentono tre tipi di cache: LRUCache, LFUCache e FastLURCache. LRUCache utilizza una hash map collegata, FastLRUCache racoglie dati su una hash map concomitante. Questa hash map elabora le richieste contemporaneamente. In questo modo, il server di ricerca produce risposte più velocemente se molte query di ricerca arrivano in parallelo. Il FastLRUCache legge i dati più velocemente del LRUCache e li inserisce più lentamente.

Fatto

Una mappa hash (detta anche hash map) assegna valori ad una chiave. La chiave è unica, ciò significa che c’è solo un valore per chiave. Una tale chiave è qualsiasi oggetto, che viene utilizzato per calcolare il valore di hash. Questo è praticamente l’“indirizzo”, cioè la posizione esatta nell’indice. È possibile utilizzarlo per trovare valori chiave all’interno di una tabella.

Il gestore della richiesta elabora appunto le richieste. Esso legge il protocollo HTTP, cerca nell’indice e fornisce le risposte. La configurazione dell’elempo Techproducts include il gestore predefinito per Solr. È possibile trovare i componenti di ricerca come elenco nel getstore della query. Questi elementi eseguono la ricerca. Per impostazione predefinita, il gestore contiene i seguenti componenti di ricerca:

  • query (richiesta)
  • facet (sfaccettatura)
  • mlt (More Like This)
  • highlight (migliore)
  • stats (statistiche)
  • debug (correggere il bug)
  • expand (espandere la ricerca)

Per il componente di ricerca More Like This (mlt), ad esempio, digitate questo comando:

<searchComponent name="mlt" class="org.apache.solr.handler.component.MoreLikeThisComponent" />

More Like This trova documenti che sono simili nel contenuto e nella struttura. Esiste come classe all’interno di Lucene. La query trova il contenuto per i visitatori del vostro sito web confrontando la stringa e i campi indicizzati.

Per configurare l’elenco, aprite innanzitutto il gestore della query:

<requestHandler name="standard" class="solr.SearchHandler" default="true">
<lst name="defaults">
<str name="echoParams">explicit</str>
<!--
<int name="rows">10</int>
<str name="fl">*</str>
<str name="version">2.1</str>
-->
</lst>
</requestHandler>

Aggiungete i componenti che avete definito voi stessi all’elenco nel gestore della query o modificate i componenti di ricerca esistenti. La ricerca riprende questi componenti quando un visitatore di una pagina web inserisce successivamente una query di ricerca sul vostro dominio. Il seguente comando inserisce un componente autocostruito prima dei componenti standard:

<arr name="first-components"></arr>
<str>NameOfTheOwnComponent</str>

Ecco come inserire il componente dopo i componenti standard:

<arr name="last-components"></arr>
<str>NameOfTheOwnComponent</str>

Così invece rinominate i componenti esistenti:

<arr name="components"></arr>
<str>facet</str>
<str>NameOfTheOwnComponent</str>

La directory dei dati predefinita si trova nella directory dell’istanza principale “instanceDir” sotto il nome “/data”. Se si vuole utilizzare una cartella diversa, cambiate la posizione utilizzando solrconfig.xml. Per farlo basta inserire un percorso fisso o associare il nome della directory al core (SolrCore) o alla directory di istanza (instanceDir). Per il collegamento al core, scrivete:

<datadir>/solr/data/$(solr.core.name)</datadir>

Tutorial Solr, parte 3: costruire un cluster cloud Solr

Apache Solr fonisce una demo cloud che spiega come configurare un cluster cloud. Naturalmente è anche possibile allo stesso tempo mettere in pratica da soli l’esempio. Per prima cosa avviate l’interfaccia della riga di comando. Per avviare Solr in modalità cloud, immettete quanto segue nel tool:

1. Innanzitutto avviate l’interfaccia utente per la riga di comando. Per avviare Solr in modalità cloud, digitate nello strumento quanto segue:

bin/solr -e cloud

Così inizia la demo.

2. Specificate quanti server (qui: nodes) devono essere collegati tramite cloud. Il numero può essere compreso tra [1] e [4] (nell’esempio sono [2]). La demo funziona su una macchina, ma utilizza una porta diversa per ogni server, che specificate successivamente (la demo specifica i numeri di porta).

Welcome to the SolrCloud example!
This interactive session will help you launch a SolrCloud cluster on your local workstation.
To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]
Please enter the port for node1 [8983]
Please enter the port for node2 [7574]
solr start –cloud -s example/cloud/node1/solr -p 8983
solr start –cloud -s example/cloud/node2/solr -p 7574

Una volta allocate tutte le porte, lo script inizia a muoversi e mostra i comandi per avviare il server (come mostrato sopra).

3. Se tutti i server sono in funzione, scegliete un nome per la vostra raccolta di dati (le parentesi quadre indicano i segnaposto e non appaiono nel codice).

Please provide a name for your new collection: [Enter_Name_HERE]

4. Create da questa collezione un frammento con SPLITSHARD. È possibile suddividre il tutto in partizioni in un secondo momento. Questo accellerà la ricerca se vengono ricevutepiù richieste contemporaneamente.

http://localhost:8983/solr/admin/collections?action=CREATESHARD&shard=[NewFragment]&collection[CollectionName]

Dopo aver creato i frammenti con SPLITSHARD, è possibile distribuire i dati utilizzando un router. Solr integra di default il router compositeID (router.jey=compositeld).

Attraverso l’interfaccia si divide il frammento in due parti. Entrambe le partizioni contengono la stessa copia dei dati originali. L’indice li divide solo lungo le nuove sottozone create di recente.

Fatto

Un router determina come i dati debbano essere distribuiti tra i frammenti e quanti bit utilizza la chiave del router. Ad esempio, se si utilizzano 2 bit, il router indicizza i dati a un quarto dello spazio di archiviazione per frammento. In questo modo si evita che grandi serie di dati su un singolo frammento occupino l’intera memoria, rallentando la ricerca. Per utilizzare il router, inserite un valore del router (ad esempio, un nome utente come MaxMuster1), il numero di bit e l’identificazione del documento: [Nome utente] / [Numero di bit]! [Identificazione del documento] (ad esempio: MaxMuster1/2!1234)

/admin/collections?action=SPLITSHARD&collection=[NomeDellaRaccolta]&shard=[NumeroDelFrammento]

5. Nell’ultimo passo, specificate il nome della vostra directory di configurazione. Sono disponibili a scelta modelli sample-techproducts-configs e _default. Quest’ultimo non specifica uno schema, quindi è comunque possibile personalizzare il proprio schema. Utilizzate il seguente comando per disabilitare la funzione senza schema da _default per l’interfaccia cloud di Solr:

curl http://localhost:8983/api/collections/[_nome_della_raccolta]/config -d &apos;{&quot;set-user-property&quot;: {&quot;update.autoCreateFields&quot;:&quot;false&quot;}}&apos;

Ciò impedisce ai campi di creare essi stessi schemi incompatibili con il resto dei file, dati i contenuti iniziali. Poiché avete bisogno del metodo http POST per questa impostazione, non potete semplicemente utilizzare la barra degli indirizzi del browser. localhost:8983 è il primo server. Se avete scelto un numero di porta diverso, dovete inserirlo lì. Sostitutite [_nome_della_raccolta] con un nome di vostra scelta.

Ecco come si imposta il cloud Solr. Per vedere se la vostra nuova raccolta è visualizzata correttamente, controllate di nuovo lo stato:

bin/solr status

Attraverso l’interfaccia utente di amministrazione potete avere una panoramica più dettagliata della distribuzione dei vostri frammenti. L’indirizzo è composto dal nome del server con il numero di porta e dalla connessione al cloud Solr in questo formato: "http://servername:portnummer/solr/#/~cloud".

Estendere Apache Solr con i plug-in

Apache Solr ha già alcune estensioni, che sono i cosiddetti handler o gestori. Precedentemente abbiamo già introdotto il gestore della query. Lucene (e quindi Solr) supporta anche alcuni utili script nativi come la classe Solr Analyzer e la classe Similarity. Potete integrare plug-in in Solr tramite un file JAR. Se costruite i vostri plug-in e interagite con le interfacce di Lucene, dovreste aggiungere i *.jar Lucene dalla vostra libreria (solr/lib/) al classpath che usate per creare il codice sorgente del plug-in.

Questo metodo funziona se si utilizza solo un core. Se utilizzate il cloud Solr, create una libreria comune per i file JAR. Per fare ciò, create una directory con l’attributo “sharedLib” nel file solr.xml sul proprio servlet. Questo è un modo semplice per caricare plug-in su singoli core:

Se avete creato il vostro proprio nucleo, create una directory per la libreria con il comando “mkdir” (Windows: “md”) in questa forma:

mkdir solr/[esempio]/solr/raccoltaA/lib

Familiarizzate un po’ con Solr provando una delle demo che vi vengono fornite, o digitate “example/solr/lib”. In entrambi i casi ci si trova ora nella directory della libreria della directory di istanza. Lì salvate i file plug-in JAR.

In alternativa, è possibile utilizzare il vecchio metodo dalle versioni precedenti di Solr se, ad esempio, non avete alcun successo sul contenitore servlet con la prima variante.

  • Per fare ciò, decomprimete il file solr.war.
  • Quindi aggiungete il file JAR con le classi da voi create alla directory WEB-INF/lib. Potete trovare la directory tramite l’app web in questo percorso: server/solr-webapp/webapp/WEB-INF/lib.
  • Comprimete nuovamente il file WAR modificato.
  • Utilizzate il vostro solr.war personalizzato.

Se estendete la libreria con un’opzione “dir”, essa aggiungerà tutti i file all’interno della rispettiva directory al classpath. Con “regex=” escludete i file che non corrispondono alle preferenze “regex”.

<lib dir="${solr.install.dir:../../../}/contrib/../lib" regex=".*\.jar"></lib>
<lib dir="${solr.install.dir:../../..}/dist/" regexe="plugin_name-\d.*\.jar"></lib>

Se state creando uno script plug-in da soli, il dialetto Lisp Clojure, tra gli altri, è raccomandato per il Java Runtime. Questo linguaggio di programmazione supporta lo sviluppo di programmi interattivi. Altre lingue integrano le proprie caratteristiche native. Clojure le mette a disposizione tramite la biblioteca. Questo metodo di lavoro è adatto per l’utilizzo del servlet Solr.

Il linguaggio di programmazione e scripting Groovy supporta la tipizzazione dinamica e statica sulla macchina virtuale Java. Il linguaggio è basato su Ruby e Python ed è compilato in codice byte Java. Poi potete eseguirlo in uno script. Groovy è dotato di alcune caratteristiche che estendono le funzioni di Java. Ad esempio, Groovy integra un semplice modello con il quale è possibile creare codice in SQL o HTML. Inoltre, la sintassi Groovy out of the box fornisce alcune espressioni comuni o campi di dati per le liste. Se elaborate JSON o XML per il vostro server di ricerca Solr, Groovy aiuta a mantenere la sintassi pulita e comprensibile.

Solr vs Elasticsearch

Quando si tratta di motori di ricerca open source, Solr ed Elasticsearch sono sempre ai primi posti nei test e nei sondaggi. Ed entrambi i server di ricerca sono basati sulla libreria Apache Java Lucene. Lucene è una base stabile. La biblioteca indicizza le informazioni in modo flessibile e fornisce rapidamente risposte a complesse richieste di ricerca. Su questa base, entrambi i motori di ricerca funzionano in modo convincente. Ciascuno dei due progetti è inoltre sostenuto da un’attiva community.

Il team di sviluppo di Elasticsearch lavora con GitHub, mentre Solr ha origine nella Apache Foundation. In confronto, il progetto Apache vanta una lunga storia alle proprie spalle e la community documenta tutti i cambiamenti, le caratteristiche e i bug già dal 2007. La documentazione di Elasticsearch è di gran lunga meno completa, cosa che viene infatti criticata. Tuttavia, Elasticsearch non ha niente da invidiare ad Apache in termini di usabilità.

Con Elasticsearch potete costruire la vostra libreria in pochi passi. Per le funzioni aggiuntive sono necessari invece plug-in premium. In questo modo è possibile gestire le impostazioni di sicurezza, monitorare il server di ricerca o analizzzare le metriche. Il server di ricerca raccoglie intorno a sé anche una famiglia di prodotti ben coordinata. Sotto l’etichetta Elastic Stack e X-Pack si ottengono gratuitamente alcune funzioni di base. I pacchetti premium sono disponibili invece solo con un abbonamento mensile, con una licenza per nodo. Solr, d’altra parte, è sempre gratuito, incluse le estensioni come Tika e Zookeeper.

I due motori di ricerca si differenziano principalmente riguardo ai loro punti focali: sia Solr che Elasticsearch possono essere utilizzati sia per piccoli set di dati che per big data, che sono distribuiti in diversi ambienti. Ma mentre Solr si concentra sulla ricerca testuale, il concetto di Elasticsearch combina la ricerca con l’analisi. Le metriche e i log sono elaborati dal servlet fin dall’inizio. Elasticsearch gestisce facilmente le corrispondenti quantità di dati, perché il server integra dinamicamente core e frammenti, e questo già dalla prima versione.

Elasticsearch era più avanti rispetto al concorrente Solr da questo punto di vista, ma da alcuni anni anche il cloud Solr consente la classificazione delle sfaccettature. Nei dati dinamici, Elasticsearch rimane ancora un passo avanti, d’altra parte il concorrente lo batte sui dati statici, fornendo risultati mirati per la ricerca full-text e calcolando in modo esatto i dati.

I vari concetti di base si riflettono anche nel caching: entrambi i fornitori consentono in linea di principio il caching delle richieste. Se una query utilizza variabili booleane complesse, entrambi memorizzano gli elementi index richiamati in segmenti, che possono fondersi in segmenti più grandi. Tuttavia, se si cambia solo un segmento, Apache Solr deve invalidare l’intera cache globale e ricaricarla. Elasticsearch invece limita questo processo al sottosegmento interessato. In questo modo si risparmiano tempo e spazio di archiviazione.

Se si lavora regolarmente con XML, http e Ruby, ci si abitua senza problemi anche a Solr. JSON, invece, è stato aggiunto successivamente tramite un’interfaccia. Ecco perché la lingua e il servlet non si adattano ancora perfettamente. Elasticsearch invece comunica nativamente tramite JSON. Il server di ricerca integra altri linguaggi come Python, Java, .NET, Ruby e PHP con un’interfaccia simile a REST.

In sintesi

Solr di Apache ed Elasticsearch di Elastic sono due potenti server di ricerca, che possiamo raccomandare senza esitazioni. Se apprezzate di più l’analisi dei dati e gestite un sito web dinamico, Elasticsearch è probabilmente la scelta appropriata. Solr, d’altra parte, vi avvantaggerà maggiormente se avete bisogno di una precisa ricerca a testo integrale per il vostro dominio. Con variabili complesse e filtri personalizzabili, è possibile adattare perfettamente il motore di ricerca verticale alle proprie esigenze.

  Solr Elasticsearch
Tipo Server di ricerca open source gratuito Server di ricerca su base open source gratuito con versioni proprietarie (gratuito o in abbonamento)
Linguaggi supportati Nativi: Java, XML, HTTPAPI: JSON, PHP, Ruby, Groovy, Clojure Nativi: JSONAPI: Java, .NET, Python, Ruby, PHP
Database Librerie Java, NoSQL, con ontologia e tassonomia, in particolare Lucene Librerie Java, NoSQL, in particolare Lucene e Hadoop
Classificazione di frammenti e nodi Piuttosto staticoSi possono aggiungere manualmente nodi con Solr cloud e frammenti con SPLITSHARDSolr7 e superiori: scalatura automatica tramite interfacciaControllo dei frammenti tramite algoritmo ad anelloNode Discovery con l’API Zookeeper DinamicoAggiunge nodi e frammenti tramite tool interno, meno controllo tramite leaderNode Discovery con tool Zen integrato
Cache Cache globale (si applica a tutti i sottosegmenti in un segmento) Cache segmentata
Ricerca full-text Molte funzioni contenute nel codice sorgente – offre anche funzioni LuceneRichiesta ParserApplicazioni di suggerimentiRicerca per analogiaCorrettore ortografico per diverse lingueCompatibile con molti formati rich textEvidenziazione La ricerca si basa principalmente sulle funzioni di LuceneL’interfaccia per i suggerimenti di ricerca cancella la maschera di ricerca per gli utenti finali, ma è meno personalizzabileControllo ortografico, matching tramite APIEvidenziazione meno personalizzabile
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.