Et enkelt filsøk med Lucene

1. Oversikt

Apache Lucene er en søkemotor i fulltekst, som kan brukes av forskjellige programmeringsspråk. For å komme i gang med Lucene, se vår innledende artikkel her.

I denne raske artikkelen vil vi indeksere en tekstfil og søkeeksempel Strenger og tekstutdrag i den filen.

2. Maven-oppsett

La oss legge til nødvendige avhengigheter først:

 org.apache.lucene lucene-core 7.1.0 

Den siste versjonen finner du her.

For å analysere søkene våre trenger vi også:

 org.apache.lucene lucene-queryparser 7.1.0 

Husk å sjekke den siste versjonen her.

3. Filsystemkatalog

For å indeksere filer, må vi først opprette en filsystemindeks.

Lucene sørger for FSDirectory klasse for å lage en filsystemindeks:

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

Her indexPath er stedet for katalogen. Hvis katalogen ikke eksisterer, oppretter Lucene den.

Lucene gir tre konkrete implementeringer av det abstrakte FSDirectory klasse: SimpleFSDirectory, NIOFSDirectory og MMapDirectory. Hver av dem kan ha spesielle problemer med et gitt miljø.

For eksempel, SimpleFSDirectory har dårlig ytelse samtidig som den blokkeres når flere tråder leses fra samme fil.

Tilsvarende NIOFSDirectory og MMapDirectory implementeringer står overfor filkanalproblemer i henholdsvis Windows og minneutgivelsesproblemer.

For å overvinne slike miljøegenskaper gir Lucene FSDirectory.open () metode. Når den påberopes, prøver den å velge den beste implementeringen avhengig av miljøet.

4. Indeks tekstfil

Når vi har opprettet indekskatalogen, la oss fortsette og legge til en fil i indeksen:

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

Her lager vi et dokument med to StringFields kalt “sti” og “filnavn” og a Tekstfelt kalt “innhold”.

Merk at vi passerer fileReader forekomst som den andre parameteren til Tekstfelt. Dokumentet legges til i indeksen ved hjelp av IndexWriter.

Det tredje argumentet i Tekstfelt eller StringField konstruktør indikerer om verdien av feltet også vil bli lagret.

Til slutt påkaller vi Lukk() av IndexWriter for å lukke og løsne låsen fra indeksfilene.

5. Søk i indekserte filer

La oss nå søke i filene vi har indeksert:

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 (spørring, 10); return topDocs.scoreDocs.stream () .map (scoreDoc -> searcher.doc (scoreDoc.doc)) .collect (Collectors.toList ()); }

La oss nå teste funksjonaliteten:

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

Legg merke til hvordan vi lager en filsystemindeks på stedet indexPath og indeksering av file1.txt.

Deretter søker vi bare etter Stringconsectetur”I “Innhold” felt.

6. Konklusjon

Denne artikkelen var en rask demonstrasjon av indeksering og søketekst med Apache Lucene. For å lære mer om indeksering, searing og spørsmål om Lucene, se introduksjonen til Lucene-artikkelen.

Som alltid kan koden for eksemplene finnes på Github.


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