Lucene: API efficienti per ricerche indicizzate

Slides:



Advertisements
Presentazioni simili
Lucene: Una libreria efficiente per ricerche di testo
Advertisements

Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Esercitazione Mid-term 2010 Uso di Lucene: text engine in Java Version:
Table View. Problemi ricorrenti Una situazione ricorrente è quella in cui il controller potrebbe avere un’altezza superiore a quella dello schermo. In.
Università degli Studi di Torino Torino, 18 maggio 2016 Maria Alisia Poggio Training Specialist – Italia, Israele, Malta, Spagna e Svizzera Italiana
BESS Biblioteca Elettronica Scienze Sociali ed Economiche Piemonte Torino, 18 maggio 2016 Maria Alisia Poggio Training Specialist – Italia, Israele, Malta,
CORSO elementare su DATABASE Applicativo utilizzato OpenOffice 3.0.
1 Come cercare le fonti di informazione scientifica Operatori e wildcards a cura della Biblioteca di Agraria.
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Basi di dati - Fondamenti
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
“Vivere insieme” – Lezione6
Java World Introduzione.
ODMG.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Primo corso per operatore ALPE NILDE hot topics
<Nome del gruppo di lavoro>
La rappresentazione delle informazioni
Come cercare le fonti di informazione scientifica RISORSE
Microsoft Access E’ un programma utile per lo sviluppo di applicazioni gestionali che si appoggiano a una base dati.
Microsoft Access E’ un programma utile per lo sviluppo di applicazioni gestionali che si appoggiano a una base dati.
Dal problema al processo risolutivo
Terza Lezione → Navigare nel file System → parte 2
how to use Windows SharePoint Services
Realizzare una pagina che mostra la classifica di un campionato sportivo a 8 squadre e richiede di inserire i risultati della giornata. Supponete di avere.
Tutorial help.ebsco.com.
Trasmettitori e ricevitori
Le basi dati CINAHL Tutorial sulla ricerca semplice
Condividere dati di Excel tramite l'esportazione in un sito di SharePoint
Approcci nella soluzione di un problema
Organizzazione fisica
I FILES AD ACCESSO SEQUENZIALE
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Servizi web per la bioinformatica strutturale
Le banche dati digitali per la storia dell’arte
Recupero polizze assicurative
Le QUERY in ACCESS Con QBE
Database
Corso Java Introduzione.
Consultare un corpus con AntConc
BookingApp La tecnologia di domani – già oggi In collaborazione con.
Access.
La piattaforma che mette le relazioni in primo piano
Basi di dati - Fondamenti
Come personalizzare il sito Web online di Microsoft SharePoint
BootCaT: Bootstrapping Corpora and Terminology
Secondo Programma in C.
4.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Modulo 4 – Ricerca di informazioni nel web
SQL per la modifica di basi di dati
Richiesta Accreditamento dei Soggetti Attuatori
le fonti di informazione scientifica
File System ed Input/Output
Eccezioni – Precisazioni e approfondimenti
Operazioni per caricare dei documenti sul Portale
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Referente per il progetto: Roberto Navigli
WORD 28/02/2019 Informatica - WORD.
Criteri per la relazione sul seminario
Fogli elettronici e videoscrittura
MODALITA’ DI RICERCA SEMPLICE
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Java Introduzione.
N O E MODELLO GITA S Come progettare una gita in base alla destinazione da condividere con altri studenti. Un modello con cui gli studenti possono.
A-to-Z Consente di Localizzare e Accedere a tutte le risorse della biblioteca: riviste online riviste cartacee riviste nelle banche dati in full text riviste.
Array e Stringhe Linguaggio C.
Docente: Sabato Bufano
Come cercare le fonti di informazione scientifica RISORSE
Transcript della presentazione:

Lucene: API efficienti per ricerche indicizzate Roberto Navigli

Lo scenario Lucene: API efficienti per ricerche indicizzate 14/09/2018

Lucene 2.0 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 14/09/2018

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 14/09/2018

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 14/09/2018

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 (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.UN_TOKENIZED); Field f3 = new Field(“term”, “Oggi ho assistito”, Field.Store.YES, Field.Index.TOKENIZED); JAVA Code Lucene: API efficienti per ricerche indicizzate 14/09/2018

Esempi di Campi Nome Field.Stored Field.Indexed Telefono YES UN_TOKENIZED URL Data DocumentType NO DocumentPath DocumentTitle TOKENIZED Text Lucene: API efficienti per ricerche indicizzate 14/09/2018

Creazione dell’indice Crea un oggetto di tipo IndexWriter Crea i documenti e aggiungili all’indice Ottimizza e chiudi l’indice (fondamentale!) IndexWriter writer = new IndexWriter(indexDir, analizzatore, bCrea); JAVA Code Document d = new Document(); d.add(new Field(“term”, “assistito”, Field.Store.NO, Field.Index.TOKENIZED); writer.addDocument(d); JAVA Code writer.optimize() writer.close(); JAVA Code Lucene: API efficienti per ricerche indicizzate 14/09/2018

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, andrò -> andar; bellissimo, bello, bellina -> bell) Analyzer analizzatore = new StandardAnalyzer(); IndexWriter writer = new IndexWriter(indexDir, analizzatore, true); JAVA Code Lucene: API efficienti per ricerche indicizzate 14/09/2018

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 14/09/2018

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

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 14/09/2018

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 14/09/2018

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 14/09/2018

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(“term”, analizzatore); Query q = parser.parse(“lezione”); JAVA Code Hits hits = is.search(q); JAVA Code for (int k = 0; k < hits.length(); k++) { Document d = hits.doc(k); // usa il documento d // ... } JAVA Code Lucene: API efficienti per ricerche indicizzate 14/09/2018

Creare un Oggetto di Tipo Query 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(“term”, analizzatore); Query q = parser.parse(“lezione AND Lucene”); JAVA Code campo di default 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 14/09/2018

Esempi di Query con QueryParser Lucene: API efficienti per ricerche indicizzate 14/09/2018

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 14/09/2018

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 14/09/2018

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 14/09/2018

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.UN_TOKENIZED)); 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.UN_TOKENIZED)); d.add(new Field(“continent”, “Europe”, Field.Store.NO, Field.Index.UN_TOKENIZED)); writer.addDocument(d); JAVA Code Lucene: API efficienti per ricerche indicizzate 14/09/2018

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 14/09/2018

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.deleteDocument(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 14/09/2018