Laboratorio di Information Retrieval Lucene Framework Emanuele Panzeri Università di Milano-Bicocca [email protected] Indice 1 Introduzione a Lucene 2 Indicizzare con Lucene Documenti e Campi Analizzatori 3 Ricerca e Query in Lucene 4 Analisi dell’indice Lucene con Luke Emanuele Panzeri Lucene Framework 2 / 56 Introduzione a Lucene Lucene1 è un insieme di librerie Java per la creazione di sistemi di Information Retrieval. Permette di gestire documenti digitali e include le principali caratteristiche di un IRS: Strumenti di analisi dei testi Classi per la gestione e creazione indici Strumenti di ricerca e composizione di query-utente Algoritmi di matching e valutazione dei risultati Lucene è utilizzato in molti Content/Document Management Systems (CMS/DMS) per ricerche Full-Text2 1 2 http://lucene.apache.org/core/ http://wiki.apache.org/lucene-java/PoweredBy Emanuele Panzeri Lucene Framework 3 / 56 Introduzione a Lucene Progetto OpenSource Rilasciato con licenza Apache 2.0 Codice sorgente accessibile e modificabile in ogni sua parte Interoperabilità Interamente implementato in linguaggio JAVA Interoperabile con altri linguaggi di programmazione C/C++ Python Objective-C Perl ... Utilizzato all’interno di SOLR come servizio di ricerca 3 3 http://lucene.apache.org/solr/ Emanuele Panzeri Lucene Framework 4 / 56 Funzionalità Principali Funzionalità Può indicizzare 95GB/ora con un hardware recente Bassa occupazione di memoria durante i processi di ricerca e indicizzazione Indici compatti (circa 20%-30% della collezione) Indicizzazione incrementale Creazione e ricerca su indici multipli (con aggregazione dei risultati) Emanuele Panzeri Lucene Framework 5 / 56 Funzionalità (cont.) Principali Funzionalità (II) Ricerche e Indicizzazione eseguiti simultaneamente (gestione concorrenza) Ricerche per campi dei documenti (titolo, autore, contenuto) Ricerche per Data (gestione intervalli) Ordinamento per ogni campo E molto altro . . . Emanuele Panzeri Lucene Framework 6 / 56 Documenti e Campi 1 Introduzione a Lucene 2 Indicizzare con Lucene Documenti e Campi Analizzatori 3 Ricerca e Query in Lucene 4 Analisi dell’indice Lucene con Luke Emanuele Panzeri Lucene Framework 7 / 56 Processo di Indicizzazione Emanuele Panzeri Lucene Framework 8 / 56 Indicizzare con Lucene: Documenti Processo di indicizzazione: Acquisizione del Documento Analisi flusso di testo Creazione indici Emanuele Panzeri Lucene Framework 9 / 56 Lucene: Documenti e Campi Lucene non si occupa della parte di individuazione e manipolazione dei documenti: Gathering Lucene non si occupa del reperimento o del Gathering dei documenti: i documenti devono essere direttamente accessibili al sistema durante la fase di Indicizzazione Text Contents Lucene gestisce unicamente valori di tipo testuale, non permette cioè di analizzare (direttamente) documenti in altri formati. Parsing Per l’indicizzazione di documenti in formato HTML, PDF, Word (etc..) occorre far precedere alla fase di Indicizzazione, una fase di Parsing dei documenti originali secondo il loro formato. Emanuele Panzeri Lucene Framework 10 / 56 Lucene: Documenti e Campi I documenti in Lucene sono rappresentati tramite le classi Java Document4 e Field5 La classe Document rappresenta l’unità di indicizzazione e di reperimento di Lucene All’interno di ogni documento possono essere inseriti uno o più campi chiamati Field Esistono Field appositamente creati per gestire testi, date, valori numerici, .. 4 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ document/Document.html 5 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ document/Field.html Emanuele Panzeri Lucene Framework 11 / 56 Lucene: Classe Field La classe Field permette di gestire i diversi tipi di dato associati ad un documento come: Stringhe di testo Valori numerici (interi, virgola mobile, ..) Date Dati Geografici (coordinate, regioni, ..) Ogni campo è identificato dal nome e dal tipo. Ad ogni campo può essere associato uno o più valori. Emanuele Panzeri Lucene Framework 12 / 56 Lucene: Classe Field I principali tipi di campo predefiniti in Lucene: IntField (String name, int value, Store stored) DoubleField (String name, double value, Store stored) FloatField (..) LongField (..) StringField (..) TextField (..) Il parametro stored indica se il campo deve essere memorizzato all’interno dell’indice o escluso per motivi di performance e occupazione dell’indice. Emanuele Panzeri Lucene Framework 13 / 56 Lucene: Classe Field (cont.) I campi numerici sono auto-esplicativi (Float-, Long-) per i contenuti che possono analizzare e gestire. Attenzione va fatta per i campi StringField6 e TextField7 TextField il campo viene indicizzato e analizzato. Pensato per testi molto lunghi. StringField il campo viene indicizzato, ma non analizzato. L’intero contenuto del campo è identificato come un singolo token. Pensato per valori identificativi (Nazione, ID, ..) 6 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ document/TextField.html 7 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ document/StringField.html Emanuele Panzeri Lucene Framework 14 / 56 Lucene: Classe Field (scenario) Esempio di documento da indicizzare: Emanuele Panzeri Lucene Framework 15 / 56 Lucene: Classe Field (esempi) Field titolo = new TextField("titolo", "Lord of the Rings", Field.Store.YES); Field autore = new TextField("autore", "J. R. Tolkien", Field.Store.YES); Field prezzo = new DoubleField("prezzo", 20.00, Field.Store.YES); Field isbn = new StringField("isbn", "978-05634-96137", Field.Store.YES); Field isbn = new StringField("isbn", "978-06183-46264", Field.Store.YES); Emanuele Panzeri Lucene Framework 16 / 56 Lucene: Classe Document La classe Document8 rappresenta l’unità fondamentale di indicizzazione e di reperimento in un indice creato da Lucene: All’interno di ogni documento possono essere presenti uno o più campi (definiti dalla classe Field) Document.add(IndexableField field) Document.removeField(String name) Document.removeFields(String name) Durante il reperimento dei documenti i campi contrassegnati come Field.Store.NO non saranno valorizzati (e quindi non accessibili) 8 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ document/Document.html Emanuele Panzeri Lucene Framework 17 / 56 Lucene: Classe Document (esempio) Document doc = new Document(); Field titolo = new TextField("titolo", "Lord of the Rings", Field.Store.YES); doc.add(titolo); Field autore = new TextField("autore", "J. R. Tolkien", Field.Store.YES); doc.add(autore); Field prezzo = new DoubleField("prezzo", 20.00, Field.Store.YES); doc.add(prezzo); Emanuele Panzeri Lucene Framework 18 / 56 Processo di Indicizzazione Emanuele Panzeri Lucene Framework 19 / 56 Indicizzare con Lucene: Analizzatori Processo di indicizzazione: Acquisizione del Documento Analisi flusso di testo Creazione indici Emanuele Panzeri Lucene Framework 20 / 56 Analizzatori In Lucene esiste una classe che si occupa dell’intero processo di analisi del contenuto dei campi: classe Analyzer9 La classe, tramite diverse componenti specializzate, si occupa di: Identificazione delle singole componenti (tokens) Eliminazione delle stopwords Applicazione algoritmi di Stemming .. altre funzioni di manipolazione dei token Fornire l’elenco dei token da inserire nell’indice 9 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ analysis/Analyzer.html Emanuele Panzeri Lucene Framework 21 / 56 La classe Analyzer La classe Analizer permette di gestitre il processo di analisi in tre principali fasi: 1 Analisi pre-tokenization: modifica e/o rimozione parti di testo tramite patterns o stringhe prefissate (tag HTML, ..) 2 Tokenizzazione: identificazione delle singole componenti del testo (tokens) 3 Analisi post-tokenization: Normalizzazione del testo Rimozione Stop Words Algoritmi di Stemming Espansione dei Sinonimi Emanuele Panzeri Lucene Framework 22 / 56 La classe Analyzer La classe Analizer permette di gestitre il processo di analisi in tre principali fasi: 1 Analisi pre-tokenization: modifica e/o rimozione parti di testo tramite patterns o stringhe prefissate (tag HTML, ..) 2 Tokenizzazione: identificazione delle singole componenti del testo (tokens) 3 Analisi post-tokenization: Normalizzazione del testo Rimozione Stop Words Algoritmi di Stemming Espansione dei Sinonimi Emanuele Panzeri Lucene Framework 22 / 56 La classe Analyzer La classe Analizer permette di gestitre il processo di analisi in tre principali fasi: 1 Analisi pre-tokenization: modifica e/o rimozione parti di testo tramite patterns o stringhe prefissate (tag HTML, ..) 2 Tokenizzazione: identificazione delle singole componenti del testo (tokens) 3 Analisi post-tokenization: Normalizzazione del testo Rimozione Stop Words Algoritmi di Stemming Espansione dei Sinonimi Emanuele Panzeri Lucene Framework 22 / 56 La classe Analyzer Le classi che gestiscono le diverse fasi dell’analisi sono: Analyzer La classe principale che racchiude l’intera analisi CharFilter Classe che si occupa della fase di pre-tokenization Tokenizer Classe che si occupa di idetnificare e separare i singoli token dal flusso di testo TokenFilter Classe che si occupa della fase di post-tokenization Emanuele Panzeri Lucene Framework 23 / 56 La classe Analyzer Le classi che gestiscono le diverse fasi dell’analisi sono: Analyzer La classe principale che racchiude l’intera analisi CharFilter Classe che si occupa della fase di pre-tokenization Tokenizer Classe che si occupa di idetnificare e separare i singoli token dal flusso di testo TokenFilter Classe che si occupa della fase di post-tokenization Emanuele Panzeri Lucene Framework 23 / 56 La classe Analyzer Le classi che gestiscono le diverse fasi dell’analisi sono: Analyzer La classe principale che racchiude l’intera analisi CharFilter Classe che si occupa della fase di pre-tokenization Tokenizer Classe che si occupa di idetnificare e separare i singoli token dal flusso di testo TokenFilter Classe che si occupa della fase di post-tokenization Emanuele Panzeri Lucene Framework 23 / 56 La classe Analyzer Le classi che gestiscono le diverse fasi dell’analisi sono: Analyzer La classe principale che racchiude l’intera analisi CharFilter Classe che si occupa della fase di pre-tokenization Tokenizer Classe che si occupa di idetnificare e separare i singoli token dal flusso di testo TokenFilter Classe che si occupa della fase di post-tokenization Emanuele Panzeri Lucene Framework 23 / 56 La classe Analyzer: Note Note: La classe Analyzer può essere estesa per creare modalità di analisi personalizzate, oltre a quelle predefinite. La fase di Analisi viene eseguita sia quando si inserisce un documento nell’indice, sia durante la fase di ricerca: occorre che le due analisi siano compatibili. L’analisi post-tokenization può essere definita come una catena di sub-analisi eseguite in successione. Un analizzatore viene applicato in maniera predefinita ad un intero flusso di testo (es. documento) Emanuele Panzeri Lucene Framework 24 / 56 Analizzatori Lucene mette a disposizione un insieme di analizzatori per gli usi più comuni che integrano le principali funzionalità richieste nei sistemi di Information Retrieval StandardAnalyzer SimpleAnalyzer WhitespaceAnalyzer LimitTokenCountAnalyzer KeywordAnalyzer Emanuele Panzeri Lucene Framework 25 / 56 StandardAnalyzer La classe StandardAnalyzer10 : Analizzatore per collezioni in lingua inglese I token vengono identificati come parole separate da spazi, punteggiatura e identificazione di numeri I token vengono riportati in caratteri minuscoli Vengono eliminate le comuni stop-words della lingua inglese Classe derivata dalla classe StopWordAnalyzerBase11 10 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/standard/StandardAnalyzer.html 11 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/util/StopwordAnalyzerBase.html Emanuele Panzeri Lucene Framework 26 / 56 StandardAnalyzer Esistono varianti della classe StandardAnalyzer per le lingue: ItalianAnalyzer12 SpanishAnalyzer13 RussianAnalyzer14 GermanAnalyzer FrenchAnalyzer ... 12 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/it/ItalianAnalyzer.html 13 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/es/SpanishAnalyzer.html 14 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/ru/RussianAnalyzer.html Emanuele Panzeri Lucene Framework 27 / 56 SimpleAnalyzer e Whitespace Analyzer La classe SimpleAnalyzer15 : Parole identificate solo come sequenze di caratteri alfabetici Riduzione in caratteri minuscoli dei token Nessuna altra modifica dei token La classe WhitespaceAnalyzer16 : Parole identificate solo se separate da spazi Riduzione in caratteri minuscoli dei token Nessuna altra modifica dei token 15 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/core/SimpleAnalyzer.html 16 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/core/WhitespaceAnalyzer.html Emanuele Panzeri Lucene Framework 28 / 56 Analizzatori - Wrappers Esistono analizzatori che modificano il processo di analisi incapsulando (wrapping) analizzatori pre-esistenti: PerFieldAnalyzerWrapper17 ShingleAnalyzerWrapper18 QueryAutoStopWordAnalyzer19 17 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/miscellaneous/PerFieldAnalyzerWrapper.html 18 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/shingle/ShingleAnalyzerWrapper.html 19 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/query/QueryAutoStopWordAnalyzer.html Emanuele Panzeri Lucene Framework 29 / 56 PerFieldAnalyzerWrapper La classe PerFieldAnalyzerWrapper20 : Permette di associare un analizzatore ad uno specifico campo (Field) del documento. Definisce un analizzatore predefinito per i campi a cui non è assegnato un analizzatore specifico. Costruttore: Analyzer a = new PerFieldAnalyzerWrapper(Analyzer A, HashMap map); 20 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/miscellaneous/PerFieldAnalyzerWrapper.html Emanuele Panzeri Lucene Framework 30 / 56 ShingleAnalyzerWrapper La classe ShingleAnalyzerWrapper21 permette di analizzare il flusso di testo da un secondo analizzatore creando n-grams, cioè tokens composti da due o più token consecutivi. La frase “un sistema di information retrieval permette di [..]“ verrà tokenizzato nelle seguenti parti: un sistema sistema di di information information retrieval ... Permette di individuare gruppi di parole che esprimono concetti importanti, come la coppia di token information-retrieval che verranno identificate come un singolo token. 21 http://lucene.apache.org/core/4_0_0/analyzers-common/org/ apache/lucene/analysis/shingle/ShingleAnalyzerWrapper.html Emanuele Panzeri Lucene Framework 31 / 56 Ricerca e Query in Lucene 1 Introduzione a Lucene 2 Indicizzare con Lucene Documenti e Campi Analizzatori 3 Ricerca e Query in Lucene 4 Analisi dell’indice Lucene con Luke Emanuele Panzeri Lucene Framework 32 / 56 Schema di un IRS Emanuele Panzeri Lucene Framework 33 / 56 Ricerche con Lucene Processo di ricerca: Formulazione della Query Rappresentazione dell’interrogazione Matching dei risultati Presentazione dei risultati rilevanti Emanuele Panzeri Lucene Framework 34 / 56 Ricerche con Lucene Il processo di ricerca in Lucene avviene tramite i seguenti passi: 1 Creazione di una Query 2 Apertura dell’indice (DirectoryReader, IndexSearcher) Avvio del processo di collezione dei documenti (Collector) 3 Calcolo del RSV dei documenti (Weight, Scorer) Filtraggio dei documenti (Filter) 4 Ordinamento dei risultati (Sort) Il processo di ricerca è dettagliato nella documentazione alla pagina http://lucene.apache.org/core/4_0_0/core/org/ apache/lucene/search/package-summary.html#algorithm Emanuele Panzeri Lucene Framework 35 / 56 Formulazione della Query La fase di Formulazione della Query viene tipicamente effettuata dall’utente con necessità informative: avviene, quando l’utente inserisce i termini di ricerca nel sistema. La formulazione della query avviene: Inserimento di termini da parte dell’utente Processo di post-analisi della query “showing results for: ABC (instead of ACB)“ Suggerimenti “push“ (stile Amazon) Suggerimenti “More like this..“ Emanuele Panzeri Lucene Framework 36 / 56 Rappresentazione dell’interrogazione Fase primaria per l’interrogazione, permette di uniformare la richiesta utente con il processo di analisi precedentemente eseguito nella creazione dell’indice: Identificazione dei campi Gestione StopWords Gestione Stemming Gestione Sinonimi Emanuele Panzeri Lucene Framework 37 / 56 Rappresentazione dell’interrogazione Altre operazioni eseguite nella fase di Rappresentazione dell’interrogazione: Gestione tolleranza agli errori identificazione parole errate (similarità, Longest-Common-Subsequence, Levenshtein-Distance) Proporre suggerimenti alle ricerche Personalizzazione delle interrogazioni Espansione della Query Emanuele Panzeri Lucene Framework 38 / 56 Rappresentazione dell’interrogazione - 2 Dalla stringa inserita dall’utente ne vengono individuate le componenti e inviate al motore di ricerca per la fase di matching: Identificazione dei token (a seconda della sintassi linguaggio usato dal motore di ricerca) Individuazione dei termini della ricerca Acquisizione dei connettori logici (AND, OR, NOT, ..) Acquisizione dei modificatori e altri componenti della query: Campi di ricerca Diversa pesatura dei termini Ricerche di prossimità ... Emanuele Panzeri Lucene Framework 39 / 56 Rappresentazione dell’interrogazione - 3 La possibilità di valutare query più o meno complesse (tipi di dati, ricerche di prossimità, etc) dipendono da: Modello di IR implementato booleano, vettoriale, probabilistico, .. Modalità di indicizzazione dei dati Tipologia (e dettaglio) dei dati memorizzati nelle strutture indice Emanuele Panzeri Lucene Framework 40 / 56 Sintassi delle ricerche in Lucene Lucene utilizza una propria sintassi per la definizione e l’inserimento delle query utente. E’ possibile: specificare in quali campi eseguire la ricerca di un termine specificare una frase (ricerca esatta) specificare un range di valori ricerche di termini “simili“ ... La sintassi è molto simile a quella già utilizzata nei comuni motori di ricerca Emanuele Panzeri Lucene Framework 41 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Come è composta la query? Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Il campo title deve contenere le parole “recipe” e “cake” Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Il campo title deve contenere le parole “recipe” e “cake” Il campo di default contenga la parola “eggs” Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Il campo title deve contenere le parole “recipe” e “cake” Il campo di default contenga la parola “eggs” Non sia presente la parola “milk” nel campo predefinito Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Il campo title deve contenere le parole “recipe” e “cake” Il campo di default contenga la parola “eggs” Non sia presente la parola “milk” nel campo predefinito Il campo “calories” abbia valori tra 100 e 300 Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Il campo title deve contenere le parole “recipe” e “cake” Il campo di default contenga la parola “eggs” Non sia presente la parola “milk” nel campo predefinito Il campo “calories” abbia valori tra 100 e 300 Il campo di default contenga la parola “chocolate” con una significatività (boost) tripla rispetto agli altri campi Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene - Esempio Query: title:recipe AND title:cake chocolateˆ3 +eggs -milk calories:[100 TO 300] Le query per-campi sono espresse come “campo:termine” Il campo title deve contenere le parole “recipe” e “cake” Il campo di default contenga la parola “eggs” Non sia presente la parola “milk” nel campo predefinito Il campo “calories” abbia valori tra 100 e 300 Il campo di default contenga la parola “chocolate” con una significatività (boost) tripla rispetto agli altri campi Dove non specificato, viene valutato il connettivo OR tra le parti di query Emanuele Panzeri Lucene Framework 42 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi utilizzata da Lucene per le query permette di specificare: Operatori Connettori booleani come: AND, OR, NOT, +, Ricerche Fuzzy Ricerche di termini smimili (utilizzando l’algoritmo di Levenshtein) Prossimità Ricerche di parole poste ad una distanza variabile Intervalli Possibilità di ricerche di intervalli di valori Boosting Incremento della significatività di un termine/frase RegExp Ricerche tramite espressioni regolari Raggruppamenti Permette di raggruppare i termini e controllare finemente la query Booleana prodotta Emanuele Panzeri Lucene Framework 43 / 56 Sintassi delle ricerche in Lucene La sintassi completa delle query è disponibile nella documentazione Lucene: http://lucene.apache.org/core/4_0_0/queryparser/org/ apache/lucene/queryparser/classic/package-summary. html#package_description Emanuele Panzeri Lucene Framework 44 / 56 Lucene: Query API Lucene permette di costruire l’albero di valutazione di una query-utente in maniera programmativa tramite l’uso delle sotto-classi della classe astratta Query22 . Ogni sotto classe piò essere combinata in differenti modi per costruire l’albero di valutazione più adatto per le esigenze di ricerche di un sistema di IR. 22 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/Query.html Emanuele Panzeri Lucene Framework 45 / 56 Lucene: Query API Le classi predefinite di Query presenti in Lucene sono: TermQuery permette la ricerca di un termine in un campo BooleanQuery permette la composizione di due o più query TermRangeQuery ricerca intervalli di termini NumericRangeQuery ricerca intervalli numerici FuzzyQuery ricerca per termini “simili“ PhraseQuery ricerche di frasi WildcardQuery ricerche di termini con prefissi e suffissi Emanuele Panzeri Lucene Framework 46 / 56 Classe TermQuery La classe TermQuery23 è la classe più semplice per la creazione di una query. Permette unicamente di cercare i documenti che contengono un termine in uno specifico campo. Esempio: Term termA = new Term(“titolo“, “pilastri“); TermQuery termQueryA = new TermQuery(termA); 23 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/TermQuery.html Emanuele Panzeri Lucene Framework 47 / 56 Classe BooleanQuery La classe BooleanQuery24 permette di comporre una query a partire da una o più BooleanClause25 . Ogni BooleanClause contiene a sua volta una sotto-query (una istanza di una classe Query: ad esempio una TermQuery) e un operatore che indica come deve avvenire la valutazione della query finale. Esiste un numero massimo di clausole che possono essere definite in una BooleanQuery oltre il quale Lucene genera una eccezione di TooManyClauses. Il valore predefinito è 1024. 24 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/BooleanQuery.html 25 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/BooleanClause.html Emanuele Panzeri Lucene Framework 48 / 56 Classe BooleanClause: Operatori Gli operatori26 disponibili per la classe BooleanClause sono: SHOULD I risultati possono verificare questa clausola, ma non è espressamente richiesta MUST La clausola deve essere tassativamente verificata nei documenti risultanti MUST NOT La clausola NON deve essere verificata: nessun documento reperito potrà verificare questa condizione 26 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/BooleanClause.Occur.html#enum_constant_summary Emanuele Panzeri Lucene Framework 49 / 56 Classe BooleanClause: Operatori Gli operatori26 disponibili per la classe BooleanClause sono: SHOULD I risultati possono verificare questa clausola, ma non è espressamente richiesta MUST La clausola deve essere tassativamente verificata nei documenti risultanti MUST NOT La clausola NON deve essere verificata: nessun documento reperito potrà verificare questa condizione 26 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/BooleanClause.Occur.html#enum_constant_summary Emanuele Panzeri Lucene Framework 49 / 56 Classe BooleanClause: Operatori Gli operatori26 disponibili per la classe BooleanClause sono: SHOULD I risultati possono verificare questa clausola, ma non è espressamente richiesta MUST La clausola deve essere tassativamente verificata nei documenti risultanti MUST NOT La clausola NON deve essere verificata: nessun documento reperito potrà verificare questa condizione 26 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/ search/BooleanClause.Occur.html#enum_constant_summary Emanuele Panzeri Lucene Framework 49 / 56 Analisi dell’indice Lucene con Luke 1 Introduzione a Lucene 2 Indicizzare con Lucene Documenti e Campi Analizzatori 3 Ricerca e Query in Lucene 4 Analisi dell’indice Lucene con Luke Emanuele Panzeri Lucene Framework 50 / 56 Luke Luke (Lucene Index Toolbox) è uno strumento che permette di analizzare il contenuto di un indice generato costruito dal framework Lucene. Permette, tra le principali funzionalità, di: Aprire un indice presente su memoria di massa Accedere ai documenti indicizzati e i loro campi (memorizzati nell’indice) Eseguire delle query di ricerca e visualizzarne i risultati Analisi dell’indice e dei top-k terms Analisi della costruzione delle Query Emanuele Panzeri Lucene Framework 51 / 56 Luke: Apertura dell’indice Emanuele Panzeri Lucene Framework 52 / 56 Luke: Dettagli dell’indice Emanuele Panzeri Lucene Framework 53 / 56 Luke: Documenti Emanuele Panzeri Lucene Framework 54 / 56 Luke: Ricerche Emanuele Panzeri Lucene Framework 55 / 56 Luke: Query Emanuele Panzeri Lucene Framework 56 / 56 Luke: Dettagli sullo score Emanuele Panzeri Lucene Framework 57 / 56