Jednostavno pretraživanje datoteka s Lucene

1. Pregled

Apache Lucene je pretraživač s punim tekstom koji mogu koristiti razni programski jezici. Da biste započeli s Luceneom, pogledajte naš uvodni članak ovdje.

U ovom ćemo kratkom članku indeksirati tekstualnu datoteku i tražiti uzorak Žice i isječci teksta unutar te datoteke.

2. Postavljanje Mavena

Prvo dodajmo potrebne ovisnosti:

 org.apache.lucen lucen-jezgra 7.1.0 

Najnoviju verziju možete pronaći ovdje.

Također, za raščlanjivanje upita za pretraživanje trebat će nam:

 org.apache.lucen lucen-queryparser 7.1.0 

Ne zaboravite ovdje provjeriti najnoviju verziju.

3. Imenik datotečnog sustava

Da bismo indeksirali datoteke, prvo ćemo morati stvoriti indeks datotečnog sustava.

Lucene daje FSDirectory klasa za stvaranje indeksa datotečnog sustava:

Direktorij direktorija = FSDirectory.open (Paths.get (indexPath));

Ovdje indexPath je mjesto direktorija. Ako direktorij ne postoji, Lucene će ga stvoriti.

Lucene pruža tri konkretne provedbe sažetka FSDirectory razred: SimpleFSDirectory, NIOFSDirectory i MMapDirectory. Svatko od njih može imati posebne probleme s danim okolišem.

Na primjer, SimpleFSDirectory ima slabe istodobne performanse jer blokira kada više niti čita iz iste datoteke.

Slično tome, NIOFSDirectory i MMapDirectory implementacije se suočavaju s problemima s kanalima datoteka u sustavu Windows i problemima s izdanjem memorije.

Da bi prevladao takve osobine okoliša, Lucene pruža FSDirectory.open () metoda. Kad se pozove, pokušava odabrati najbolju implementaciju ovisno o okruženju.

4. Indeksna tekstualna datoteka

Nakon što kreiramo direktorij indeksa, idemo naprijed i dodajte datoteku u indeks:

javna praznina addFileToIndex (String filepath) {Put puta = Paths.get (filepath); Datoteka datoteka = path.toFile (); IndexWriterConfig indexWriterConfig = novi IndexWriterConfig (analizator); Direktorij indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexWriter indexWriter = novi IndexWriter (indexDirectory, indexWriterConfig); Dokument dokumenta = novi dokument (); FileReader fileReader = novi FileReader (datoteka); document.add (novi TextField ("sadržaj", fileReader)); document.add (novi StringField ("put", file.getPath (), Field.Store.YES)); document.add (novi StringField ("naziv datoteke", file.getName (), Field.Store.YES)); indexWriter.addDocument (dokument); indexWriter.close (); }

Ovdje stvaramo dokument s dvoje StringFields pod nazivom "put" i "naziv datoteke" i a Polje za tekst pod nazivom "sadržaj".

Imajte na umu da prolazimo fileReader primjer kao drugi parametar za Polje za tekst. Dokument se dodaje u indeks pomoću IndexWriter.

Treći argument u Polje za tekst ili StringField konstruktor označava hoće li se vrijednost polja također pohraniti.

Napokon, pozivamo se na Zatvoriti() od IndexWriter da biste graciozno zatvorili i oslobodili bravu iz datoteka indeksa.

5. Pretražite indeksirane datoteke

Sada pretražimo datoteke koje smo indeksirali:

javni popis pretraživačkih datoteka (String inField, String queryString) {Query query = novi QueryParser (inField, analizator) .parse (queryString); Direktorij indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexReader indexReader = DirectoryReader .open (indexDirectory); IndexSearcher pretraživač = novi IndexSearcher (indexReader); TopDocs topDocs = searcher.search (upit, 10); vratiti topDocs.scoreDocs.stream () .map (scoreDoc -> pretraživač.doc (scoreDoc.doc)) .collect (Collectors.toList ()); }

Isprobajmo sada funkcionalnost:

@Test javna praznina givenSearchQueryWhenFetchedFileNamehenCorrect () {String indexPath = "/ tmp / index"; Niz podatakaPath = "/tmp/data/file1.txt"; Direktorij direktorija = FSDirectory .open (Paths.get (indexPath)); LuceneFileSearch luceneFileSearch = novo LuceneFileSearch (direktorij, novi StandardAnalyzer ()); luceneFileSearch.addFileToIndex (dataPath); Popis dokumenata = luceneFileSearch .searchFiles ("content", "consectetur"); assertEquals ("file1.txt", docs.get (0) .get ("naziv datoteke")); }

Primijetite kako na mjestu stvaramo indeks datotečnog sustava indexPath i indeksiranje file1.txt.

Zatim jednostavno tražimo Nizconsectetur”U "sadržaj" polje.

6. Zaključak

Ovaj je članak bio brza demonstracija indeksiranja i pretraživanja teksta s Apache Luceneom. Da biste saznali više o indeksiranju, brisanju i upitima Lucene, pogledajte naš uvod u članak Lucene.

Kao i uvijek kod za primjere možete pronaći na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found