En simpel filsøgning med Lucene

1. Oversigt

Apache Lucene er en søgemaskine i fuld tekst, der kan bruges af forskellige programmeringssprog. For at komme i gang med Lucene henvises til vores indledende artikel her.

I denne hurtige artikel indekserer vi en tekstfil og søgereksempel Strenge og tekstuddrag inden for den fil.

2. Maven-opsætning

Lad os først tilføje nødvendige afhængigheder:

 org.apache.lucene lucene-core 7.1.0 

Den seneste version kan findes her.

For at analysere vores søgeforespørgsler har vi også brug for:

 org.apache.lucene lucene-queryparser 7.1.0 

Husk at tjekke den nyeste version her.

3. Filsystemkatalog

For at indeksere filer skal vi først oprette et filsystemindeks.

Lucene leverer FSDirectory klasse for at oprette et filsystemindeks:

Katalogkatalog = FSDirectory.open (Paths.get (indexPath));

Her indekssti er bibliotekets placering. Hvis biblioteket ikke findes, opretter Lucene det.

Lucene giver tre konkrete implementeringer af det abstrakte FSDirectory klasse: SimpleFSDirectory, NIOFSDirectory og MMapDirectory. Hver af dem kan have specielle problemer med et givet miljø.

For eksempel, SimpleFSDirectory har dårlig samtidig ydeevne, da den blokerer, når flere tråde læses fra den samme fil.

Tilsvarende er NIOFSDirectory og MMapDirectory implementeringer står over for filkanalproblemer i henholdsvis Windows og hukommelsesfrigivelsesproblemer.

For at overvinde sådanne miljøegenskaber giver Lucene FSDirectory.open () metode. Når den påberåbes, forsøger den at vælge den bedste implementering afhængigt af miljøet.

4. Indeks tekstfil

Når vi har oprettet indeksmappen, lad os fortsætte og tilføje en fil til indekset:

public void addFileToIndex (String filepath) {Path path = Paths.get (filepath); Filfil = sti.tilFil (); IndexWriterConfig indexWriterConfig = ny IndexWriterConfig (analysator); Directory indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexWriter indexWriter = ny IndexWriter (indexDirectory, indexWriterConfig); Dokumentdokument = nyt dokument (); FileReader fileReader = ny FileReader (fil); document.add (nyt TextField ("indhold", fileReader)); document.add (ny StringField ("sti", file.getPath (), Field.Store.YES)); document.add (nyt StringField ("filnavn", file.getName (), Field.Store.YES)); indexWriter.addDocument (dokument); indexWriter.close (); }

Her opretter vi et dokument med to StringFields med navnet “sti” og “filnavn” og a Tekstfelt kaldes "indhold".

Bemærk, at vi passerer fileReader instans som den anden parameter til Tekstfelt. Dokumentet føjes til indekset ved hjælp af IndexWriter.

Det tredje argument i Tekstfelt eller StringField konstruktør angiver, om værdien af ​​feltet også vil blive lagret.

Endelig påberåber vi os tæt() af IndexWriter for at lukke og frigøre låsen fra indeksfilerne.

5. Søg i indekserede filer

Lad os nu søge i de filer, vi har indekseret:

public List searchFiles (String inField, String queryString) {Query query = new QueryParser (inField, analyzer) .parse (queryString); Directory indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexReader indexReader = DirectoryReader. Open (indexDirectory); IndexSearcher searcher = ny IndexSearcher (indexReader); TopDocs topDocs = searcher.search (forespørgsel, 10); returner topDocs.scoreDocs.stream () .map (scoreDoc -> searcher.doc (scoreDoc.doc)) .collect (Collectors.toList ()); }

Lad os nu teste funktionaliteten:

@Test offentlig ugyldighed givetSearchQueryWhenFetchedFileNamehenCorrect () {String indexPath = "/ tmp / index"; Streng dataPath = "/tmp/data/file1.txt"; Katalogkatalog = FSDirectory .open (Paths.get (indexPath)); LuceneFileSearch luceneFileSearch = ny LuceneFileSearch (bibliotek, ny StandardAnalyzer ()); luceneFileSearch.addFileToIndex (dataPath); Liste docs = luceneFileSearch .searchFiles ("indhold", "consectetur"); assertEquals ("file1.txt", docs.get (0) .get ("filnavn")); }

Bemærk hvordan vi opretter et filsystemindeks på placeringen indekssti og indeksering af fil1.txt.

Derefter søger vi simpelthen efter Snorconsectetur”I "indhold" Mark.

6. Konklusion

Denne artikel var en hurtig demonstration af indeksering og søgning af tekst med Apache Lucene. For at lære mere om indeksering, searing og forespørgsler om Lucene, se vores introduktion til Lucene-artiklen.

Som altid kan koden for eksemplerne findes på Github.


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