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