Lucene: Una libreria efficiente per ricerche di testo

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
1 Querying Modelli per la ricerca. 2 Modelli di Retrieval Un modello per il retrieval specifica rappresentazione dei documenti rappresentazione delle.
DBMS (DataBase Management System)
Java Stream e File. La classe File Per operare con lintero file java mette a disposizione la classe File Per utilizzare la classe File è necessario importare.
Corsi per il personale Bicocca-Insubria
File System Cos’è un File System File e Directory
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Le gerarchie di tipi.
Gestione del processore
Java2 Esercitazioni del corso di Sistemi Informativi Marina Mongiello
Frontespizio Economia Monetaria Anno Accademico
Training On Line – CONA. 2 Richiesta Da Menu: Conferimenti ad inizio anno termico > Agosto > Annuali > Nuova Richiesta Si accede alla pagina di Richiesta.
Training On Line - Report. 2 Report storico Da menu: Reportistica -> Report storico Si accede alla pagina di selezione del report storico.
Università La Sapienza Web programming e programmazione multimediale 1 Web Programming e comunicazione multimediale Lezione 10: PHP.
Realizzazione del file system
Realizzazione del file system
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
1 IT FOR BUSINESS AND FINANCE ACCESS INTRODUCTION.
1 Esempi di consistenza sui limiti Non consistente sui limiti, considera Z=2, poi X-3Y=10 Ma il dominio qui sotto e consistente sui limiti: Confrontare.
File.
Algoritmo di Ford-Fulkerson
Programmazione 1 9CFU – TANTE ore
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
CORSO DI RICERCA BIBLIOGRAFICA 4. giornata (20 marzo 2008) Web of Science Beilstein e Gmelin Crossfire.
Laboratorio di Informatica
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Lezione 5 Trasduttori attivi: piezoelettrici termocoppie
I File.
Sistemi Operativi - Introduzione 1 Il sistema operativo UNIX Dettagli e comandi avanzati Niccolò Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Sistemi Operativi - Introduzione 1 Il sistema operativo UNIX AWK Niccolò Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Daniel Stoilov Tesi di Laurea
Introduzione alle basi di dati
Java Collections.
DBMS ( Database Management System)
19 Lezione 21/5/04 Composizione dell'immagine 1 COMPOSIZIONE DELLIMMAGINE.
Portale Capacità STOGIT
Chinosi Michele – matr.: La seconda release di Virtuose basata su database XML La seconda release di Virtuose basata su.
Educare al multimediale 1 – Verso il digitale 2 Presentazione a cura di Gino Roncaglia Prima parte: Informazione in formato digitale.
C APITOLO 6 © 2012 Giorgio Porcu – Aggiornamennto 22/02/2012 G ESTIRE D ATI E C ARTELLE DI LAVORO Excel Avanzato.
Progettazione multimediale
Elementi di Informatica di base
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
1 Guida per linsegnamento nei corsi per il conseguimento del CERTIFICATO DI IDONEITÀ ALLA GUIDA DEL CICLOMOTORE.
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
QUIZ – PATENTE EUROPEA – ESAME WORD
La versione 18 di Aleph500: le novità CATALOGAZIONE Rita Vanin Ottobre 2007.
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
1 Ly-LAB Sistema di gestione dei dati analitici di laboratorio.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Multimedia Information Retrieval
Documentazione Tecnica
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Modulo 6 Test di verifica
METODI DI RAPPRESENTAZIONE TECNICA
A.P. cat. B - 1 Per chi vuole: Libro di testo D.P. Curtis, K. Foley, K. Sen, C. Morin Informatica di base 2° edizione Mc Graw-Hill Companies.
Pagine ASP parte 3 I data base Stefano Schacherl.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Esercitazione Mid-term 2010 Uso di Lucene: text engine in Java Version:
Progettazione Logica Il prodotto della progettazione logica è uno schema logico che rappresenta le informazioni contenute nello schema E-R in modo corretto.
Lezione 01 Writer: I Dati inserimento e modifica.
Lucene: API efficienti per ricerche indicizzate
Transcript della presentazione:

Lucene: Una libreria efficiente per ricerche di testo Roberto Navigli, Fulvio D’Antonio

Lo scenario Lucene: API efficienti per ricerche indicizzate 27/03/2017

Lucene 3.1 E’ una API (Application Programming Interface) Estremamente efficiente e scalabile Mette a disposizione le classi fondamentali per costruire un indicizzatore e un motore di ricerca 100% Java, nessuna dipendenza, nessun config file Fa parte del progetto Apache Disponibile online: http://lucene.apache.org Utilizzato da: Wikipedia, Wikimedia, ecc. Technorati Monster.com TheServerSide SourceForge Eclipse Beagle Molti progetti commerciali Lucene: API efficienti per ricerche indicizzate 27/03/2017

Utilizzato da accademici per grandi progetti: Ancora su Lucene Utilizzato in: TREC (Text Retrieval Conference) Sistemi di Document Retrieval a livello enterprise Parte di motori web/basi di dati Utilizzato da accademici per grandi progetti: MIT (AI Lab) Progetto Know-It-All Lucene: API efficienti per ricerche indicizzate 27/03/2017

Lucene in breve Documento sorgente Hits Hits Hits Document Query my_doc1: Oggi ho assistito a una lezione su Lucene. Documento sorgente Lezione & Lucene Hits (risultati della ricerca) Hits (risultati della ricerca) Hits (risultati della ricerca) Document nome: my_doc1 term: oggi, ho, assistito, a, una,lezione, su, Lucene Query search() addDocument() IndexWriter IndexSearcher optimize() close() Indice Lucene Lucene: API efficienti per ricerche indicizzate 27/03/2017

Utilità di conversione: Conversione in Testo Normalmente, è necessario convertire le risorse da indicizzare in formato testo se esse sono specificate mediante altri formati (es. Word, PDF, HTML, XML, ecc.) Utilità di conversione: PDFBox (PDF) Jakarta POI (DOC, RTF, ecc.) JTidy (HTML) Lucene: API efficienti per ricerche indicizzate 27/03/2017

Un documento è un insieme di campi Documenti in Lucene In Lucene Un documento è una unità di indicizzazione e ricerca (differente dal documento inteso come file) Un documento è un insieme di campi Ogni campo ha un nome e un valore testuale Decidiamo noi quali informazioni inserire nel documento! Document d = new Document(); d.add(new Field(nome_campo, valore, storeable, indexable)); JAVA Code String Field.Store Field.Index Lucene: API efficienti per ricerche indicizzate 27/03/2017

Un campo di un documento specifica: Campi di un Documento Un campo di un documento specifica: Il nome del campo (stringa) Il valore testuale del campo (stringa) Se il valore del campo deve essere memorizzato nel documento Necessario per recuperare il valore del campo dai documenti che rispondono a una interrogazione Se il valore del campo deve essere indicizzato Necessario per la ricerca E’ possibile richiedere l’analisi del testo prima dell’indicizzazione (ANALYZED, deprecato il vecchio TOKENIZED) Field f1 = new Field(“name”, “my_doc1”, Field.Store.YES, Field.Index.NO); Field f2 = new Field(“term”, “Lucene”, Field.Store.YES, Field.Index.NOT_ANALYZED); Field f3 = new Field(“term”, “Oggi ho assistito”, Field.Store.YES, Field.Index.ANALYZED); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Esempi di Campi Nome Field.Store Field.Index Telefono YES NOT_ANALYZED URL Data DocumentType NO DocumentPath DocumentTitle ANALYZED Text Lucene: API efficienti per ricerche indicizzate 27/03/2017

Creazione dell’indice Crea un oggetto di tipo IndexWriter: Esistono molti tipi diversi di costruttori a seconda delle esigenze. Uno dei più usati è: Crea i documenti e aggiungili all’indice Ottimizza e chiudi l’indice (fondamentale!) IndexWriter writer = new IndexWriter(indexDir, analizzatore, bCrea, maxFldLen); JAVA Code Document d = new Document(); d.add(new Field(“term”, “assistito”, Field.Store.NO, Field.Index.ANALYZED)); writer.addDocument(d); JAVA Code writer.optimize() writer.close(); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Usata per la memorizzazione di indici La classe Directory Usata per la memorizzazione di indici A livello astratti n oggetto Directory è una lista di file. Random Access sia in lettura che scrittura Aggiunta, cancellazione aggionamento di file Lucene implementa diversi tipi di Directory: RAM-based indices; Indic memorizzati in database, via JDBC; Indici su file; Lucene: API efficienti per ricerche indicizzate 27/03/2017

Esempi di directory In memoria RAM: Su file RAMDirectory dir= new RAMDirectory(); Utile per creare indici “al volo”, l’indice non è persistente (viene perso una volta che l’esecuzione del programma è terminata) Su file FSDirectory dir = FSDirectory.open(new File("temp")); Memorizzazione persistente i dati sono disponibili anche dopo che l’esecuzione del programma è terminata Lucene: API efficienti per ricerche indicizzate 27/03/2017

Si occupa dell’estrazione di termini a partire da un testo in input La classe Analyzer Si occupa dell’estrazione di termini a partire da un testo in input Istanzia un tokenizer, che suddivide il flusso di caratteri in token Applica dei filtri ai singoli token Può eliminare stopwords (parole frequenti senza contenuto informativo, es. a, the, of, in, etc.) Può effettuare lo stemming (andare, andò -> and; bellissimo, bello, bellina -> bell) Analyzer analizzatore = new StandardAnalyzer(); IndexWriter writer = new IndexWriter(indexDir, analizzatore, bCrea, MaxFieldLength.UNLIMITED); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Analizzatori in Lucene WhitespaceAnalyzer: estrae i token separati da spazi (non modifica maiuscole/minuscole) SimpleAnalyzer: tokenizza sulla base di spazi e caratteri speciali; applica il minuscolo ai token StopAnalyzer: come SimpleAnalyzer ma elimina le stopwords (the, an, a, ecc.) StandardAnalyzer: è il più completo (Whitespace+Stop+altri trattamenti) SnowballAnalyzer: effettua anche lo stemming Lucene: API efficienti per ricerche indicizzate 27/03/2017

Compatibilità con precedenti versioni di Lucene Lucene è un progetto costantemente mantenuto e sviluppato Occasionalmente, un cambio di versione, può causare incompatibilità all’interno di progetti pre-esistent Es: il cambio da versione 2.4 a 3.1 di Lucene Per ragioni di backward compatibility alcuni oggetti vanno istanziati specificando un campo di tipo “Version” Es: StopAnalyzer analyzer = new StopAnalyzer(Version.LUCENE_30); Utilizzare, laddove non vi siano esigenze particolari, la versione LUCENE_30 Lucene: API efficienti per ricerche indicizzate 27/03/2017

Esempi di analisi The quick brown fox jumped over the lazy dogs XY&Z Corporation – xyz@example.com Lucene: API efficienti per ricerche indicizzate 27/03/2017

Analizzatori Personalizzati E’ possibile creare il proprio analizzatore estendendo la classe Analyzer: class MyAnalyzer extends Analyzer { private Set stopWords = StopFilter.makeStopSet(StopAnalyzer.ENGLISH_STOP_WORDS); public TokenStream tokenStream(String fieldName, Reader reader) TokenStream ts = new StandardTokenizer(reader); ts = new StandardFilter(ts); ts = new LowerCaseFilter(ts); ts = new StopFilter(ts, stopWords); return ts; } JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Rappresenta un documento virtuale della collezione La classe Document Rappresenta un documento virtuale della collezione Può essere associato a qualunque oggetto informativo (email, pagina web, file, frammento di testo, ecc.) che si vuole recuperare in fase di ricerca Virtuale perché il file sorgente è irrilevante per Lucene E’ un insieme di campi Un campo può rappresentare il contenuto del documento stesso o i meta-dati associati al documento String valore = d.get(“name”); String[] valori = d.getValues(“term”); List campi = d.getFields(); Field campo = getField(“name”); campi = d.getFields(“term”); d.removeField(“name”); d.removeFields(“term”); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Indicizzazione: Ricapitoliamo le Classi Fondamentali IndexWriter Si occupa del processo di indicizzazione Analyzer Si occupa dell’analisi dei documenti da indicizzare Document Rappresenta un singolo documento della collezione Field Rappresenta un campo del documento della collezione Lucene: API efficienti per ricerche indicizzate 27/03/2017

Cercare in un Indice Apri l’indice Crea la query Effettua la ricerca Recupera i documenti IndexSearcher is = new IndexSearcher(indexDir); JAVA Code QueryParser parser = new QueryParser(Version.LUCENE_30, “term”, analizzatore); Query q = parser.parse(“lezione”); JAVA Code ScoreDoc[] docs = searcher.search(q, <numHits>).scoreDocs; JAVA Code for (ScoreDoc doc:docs) { Document d = is.doc(doc.doc); // ottiene il documento float score =doc.score; // punteggio del documento // ... } JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Creare un Oggetto di Tipo Query Tanti tipi di query, esempi di due modi differenti: Effettuare il parsing di una query testuale (come in Google) Creare l’oggetto costruendo l’espressione di ricerca istanziando e componendo classi che specializzano la classe Query Si esplicita la query costruendola in modo programmatico Non effettua alcuna analisi del testo della query (al contrario di QueryParser, che utilizza l’analizzatore in input) QueryParser parser = new QueryParser(Version.LUCENE_30, “term”, analizzatore); Query q = parser.parse(“lezione AND Lucene”); JAVA Code BooleanQuery q = new BooleanQuery(); q.add(new TermQuery(new Term(“term”, “lezione”)), BooleanClause.Occur.MUST); q.add(new TermQuery(new Term(“term”, “Lucene”)), BooleanClause.Occur.MUST); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Esempi di Query con QueryParser Lucene: API efficienti per ricerche indicizzate 27/03/2017

Specializzazioni della classe Query Per costruire un oggetto Query componendo in un’espressione istanze delle sue sottoclassi, ad es.: TermQuery (cerca un termine) ConstantScoreRangeQuery (cerca in un intervallo) PrefixQuery (termini che iniziano con la stringa specificata) campo valore Query q = new TermQuery(new Term(“term”, “lezione”)); JAVA Code campo limite inf. Query q = new ConstantScoreRangeQuery(“mese_pubblicazione”, “198805”, “198810”, true, true); JAVA Code limite sup. includi limite inf. e sup. campo prefisso Query q = new PrefixQuery(new Term(“term”, “lez”)); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Pesatura dei Risultati di una Ricerca Lucene calcola la rilevanza di un documento rispetto a una query Usando una combinazione di modello booleano (per filtrare i documenti) e di Vector Space Model (per pesarli) La pesatura è effettuata tenendo conto dei seguenti fattori: tf(t): term frequency (il numero di termini che fanno match nel documento) idf(t): inverse document frequency (in quanti documenti appare il termine rispetto al totale dei documenti?) lengthNorm(t, d): numero di termini del campo di t che appaiono nel documento coord: numero di termini che fanno match http://lucene.apache.org/java/docs/scoring.html Lucene: API efficienti per ricerche indicizzate 27/03/2017

Ricerca: Ricapitoliamo le Classi Fondamentali IndexSearcher Ha diversi metodi per la ricerca in un indice Term Unità di base per costruire un’interrogazione Costituita da due elementi fondamentali: nome del campo e valore del campo Query E’ una classe astratta di cui esistono numerose classi concrete: TermQuery, BooleanQuery, PhraseQuery, RangeQuery, FilteredQuery, ecc. Hits E’ un contenitore di risultati (documenti) della ricerca con ranking associato Lucene: API efficienti per ricerche indicizzate 27/03/2017

Operazioni sull’Indice: Aggiunta di Documenti Aggiungere documenti all’indice: Nota: Documenti appartenenti allo stesso indice possono contenere campi differenti (questo permette di avere oggetti di tipo diverso indicizzati mediante lo stesso indice) Document d = new Document(); d.add(new Field(“id”, “06”)); d.add(new Field(“name”, “Rome”, Field.Store.YES, Field.Index.NOT_ANALYZED)); d.add(new Field(“country”, “Italy”, Field.Store.YES, Field.Index.NO)); d.add(new Field(“text”, “Rome is the capital of Italy. Its river, the Tiber, etc...”, Field.Store.NO, Field.Index.TOKENIZED)); writer.addDocument(d); JAVA Code Document d = new Document(); d.add(new Field(“id”, “0039”)); d.add(new Field(“name”, “Italy”, Field.Store.YES, Field.Index.NOT_ANALYZED)); d.add(new Field(“continent”, “Europe”, Field.Store.NO, Field.Index.NOT_ANALYZED)); writer.addDocument(d); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Operazioni sull’Indice: Eliminazione di Documenti (1) Mediante la classe IndexReader: es. eliminare il primo documento es. eliminare tutti i documenti aventi il campo city valorizzato con Amsterdam NOTA: per salvare le cancellazioni, è necessario chiudere l’IndexReader! IndexReader reader = IndexReader.open(indexDir); reader.deleteDocument(0); JAVA Code reader.deleteDocuments(new Term(“city”, “Amsterdam”)); JAVA Code reader.close(); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Operazioni sull’Indice: Eliminazione di Documenti (2) Mediante la classe IndexWriter: es. eliminare i documenti aventi il campo city valorizzato con Amsterdam: es. eliminare i documenti che rispondono all’interrogazione: E’ possibile aggiornare un documento (equivale a cancellare e aggiungere): NOTA: IndexReader non può essere utilizzato per cancellare se un IndexWriter è aperto sullo stesso indice writer.deleteDocuments(new Term(“city”, “Amsterdam”)); JAVA Code writer.deleteDocuments(query); JAVA Code writer.updateDocument(new Term(“city”, “Amsterdam”), newDoc); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

SpanNearQuery specifica span che devono essere uno “vicino” all’altro Span Query Sono interrogazioni che forniscono informazioni riguardo alla posizione in cui un match ha avuto luogo all’interno di un documento SpanTermQuery permette una interrogazione per termine (building block!) SpanFirstQuery impone una posizione massima dell’occorrenza rispetto all’inizio di un campo SpanNearQuery specifica span che devono essere uno “vicino” all’altro SpanNotQuery, SpanOrQuery, SpanRegexQuery, ecc. Lucene: API efficienti per ricerche indicizzate 27/03/2017

E’ l’elemento di base di una SpanQuery: SpanTermQuery E’ l’elemento di base di una SpanQuery: SpanTermQuery span = new SpanTermQuery(new Term(“term”, “antonio”)); Spans spans = span.getSpans(reader); while(spans.next()) { int docNumber = spans.doc(); Document doc = reader.document(docNumber); int primoToken = spans.start(); int ultimoToken = spans.end(); // e’ il primo token che segue il match // fa qualcosa con il documento } JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

SpanFirstQuery Richiede che il match avvenga a distanza al più dist dal primo token del campo specificato SpanTermQuery span = new SpanTermQuery(new Term(“term”, “antonio”)); SpanFirstQuery first = new SpanFirstQuery(span, dist); Spans spans = first.getSpans(reader); while(spans.next()) { int docNumber = spans.doc(); Document doc = reader.document(docNumber); int primoToken = spans.start(); int ultimoToken = spans.end(); // e’ il primo token che segue il match // fa qualcosa con il documento } JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

SpanNearQuery Effettua interrogazioni ponendo un limite di vicinanza per le varie clausole di tipo SpanQuery SpanTermQuery span1 = new SpanTermQuery(new Term(“term”, “antonio”)); SpanTermQuery span2 = new SpanTermQuery(new Term(“term”, “meucci”)); SpanQuery[] clauses = new SpanQuery[] { span1, span2 }; SpanNearQuery near = new SpanNearQuery(clauses, 2, true); Spans spans = near.getSpans(reader); while(spans.next()) { int docNumber = spans.doc(); Document doc = reader.document(docNumber); int primoToken = spans.start(); int ultimoToken = spans.end(); // e’ il primo token che segue il match // fa qualcosa con il documento } JAVA Code distanza massima nell’ordine o no? Lucene: API efficienti per ricerche indicizzate 27/03/2017

Term Vector In Lucene, è possibile rappresentare tutti i termini e i conteggi di occorrenze dei termini in uno specifico campo di un’istanza di Document: (nomeCampo, (term1, termCount1), ..., (termn, termCountn)) Queste informazioni vengono memorizzate in un campo solo se specificato esplicitamente: Field f = new Field(“term”, testo, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Term Vector Le opzioni sono: Field.TermVector.NO Field.TermVector.YES Non memorizza questa informazione Field.TermVector.YES Memorizza le coppie (termine, conteggio) Field.TermVector.WITH_POSITIONS Memorizza anche le posizioni dei token Field.TermVector.WITH_OFFSETS Memorizza anche le posizioni dei token al livello del carattere Field.TermVector.WITH_POSITIONS_OFFSETS Memorizza anche le posizioni dei token e al livello del carattere Lucene: API efficienti per ricerche indicizzate 27/03/2017

Accedere ai Term Vector Per accedere a un term vector, è necessario richiamare un apposito metodo della classe IndexReader: Se è stata memorizzata anche l’informazione di posizione e/o offset, è possibile effettuare un cast alla classe TermPositionVector: TermFreqVector tfv = reader.getTermFreqVector(docNumber, fieldName); TermFreqVector[] tfvs = reader.getTermFreqVectors(docNumber); String[] terms = tfv.getTerms(); int[] freqs = tfv.getTermFrequencies(); JAVA Code TermPositionVector tpv = (TermPositionVector)tfv; For (int k = 0; k < terms.length; k++) { // lavora sul termine k-esimo int[] positions = tpv.getTermPositions(k); TermVectorOffsetInfo[] offsets = tpv.getOffsets(k); // ... } JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Come ottenere il numero di un documento? Dato il risultato di una interrogazione, è necessario chiamare il metodo id(): Hits hits = is.search(q); for (int k = 0; k < hits.length(); k++) { int docNumber = hits.id(k); TermFreqVector tfv = reader.getTermFreqVector(docNumber, fieldName); // usa tfv... } JAVA Trick Lucene: API efficienti per ricerche indicizzate 27/03/2017

Perché utilizzare i TermFreqVector? Permettono di espandere l’interrogazione originaria utilizzando termini dai documenti (Relevance Feedback) L’utente o il sistema selezionano i documenti più rilevanti (es. i primi x documenti nella lista ordinata per punteggio) Si ottengono i termini dai TermFreqVector di ciascun documento e si costruisce una nuova interrogazione E’ possibile applicare un “boost” sulle frequenze dei termini Lucene: API efficienti per ricerche indicizzate 27/03/2017

Boosting Come aumentare l’importanza di un documento e/o di un campo in fase di indicizzazione? Metodo setBoost() Il valore di boost è un float compreso tra 0.0 e 1.0 Il valore di boost del documento e del campo viene utilizzato da Lucene per calcolare l’importanza del documento recuperato in fase di ricerca http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/search/Similarity.html Document d = new Document(); Field f = new Field(“term”, “assistito”, Field.Store.NO, Field.Index.ANALYZED) d.setBoost(1.0); f.setBoost(0.9); d.add(f); writer.addDocument(d); JAVA Code Lucene: API efficienti per ricerche indicizzate 27/03/2017

Visualizzazione e diagnosi di un indice: Luke Luke: uno strumento di visualizzazione e diagnostica degli indici Lucene Scorrere i documenti per id o per termine Visualizzare documenti Recuperare una lista ordinata dei termini più frequenti Eseguire ricerche e scorrere i risultati Eliminare documenti dall’indice Ottimizzare un indice Lucene: API efficienti per ricerche indicizzate 27/03/2017

Sviluppi di Lucene Nutch Solr Mahout Un motore di ricerca web che si basa su Lucene Solr Server di ricerca ad alte prestazioni costruito utilizzando Lucene Mahout Sottoprogetto Lucene con l’obiettivo di creare una suite di librerie scalabili di apprendimento automatico Lucene: API efficienti per ricerche indicizzate 27/03/2017