Jednoduché vyhľadávanie súborov s Lucene

1. Prehľad

Apache Lucene je fulltextový vyhľadávací nástroj, ktorý môžu používať rôzne programovacie jazyky. Ak chcete začať s programom Lucene, prečítajte si náš úvodný článok tu.

V tomto rýchlom článku indexujeme textový súbor a hľadáme ukážku Struny a textové úryvky v danom súbore.

2. Nastavenie Maven

Najprv pridajme potrebné závislosti:

 org.apache.lucene lucenove jadro 7.1.0 

Najnovšiu verziu nájdete tu.

Na analýzu našich vyhľadávacích dotazov budeme tiež potrebovať:

 org.apache.lucene lucene-queryparser 7.1.0 

Tu nezabudnite skontrolovať najnovšiu verziu.

3. Adresár systému súborov

Aby sme mohli indexovať súbory, najskôr si musíme vytvoriť index súborového systému.

Lucene poskytuje FSDirectory triedy na vytvorenie indexu súborového systému:

Adresárový adresár = FSDirectory.open (Paths.get (indexPath));

Tu indexPath je umiestnenie adresára. Ak adresár neexistuje, vytvorí ho Lucene.

Lucene poskytuje tri konkrétne implementácie abstraktu FSDirectory trieda: SimpleFSDirectory, NIOFSDirectory a MMapDirectory. Každý z nich môže mať v danom prostredí špeciálne problémy.

Napríklad, SimpleFSDirectory má slabý súbežný výkon, pretože blokuje čítanie viacerých vlákien z jedného súboru.

Podobne NIOFSDirectory a MMapDirectory implementácie čelia problémom so súborovými kanálmi v systéme Windows a problémom s uvoľňovaním pamäte.

Na prekonanie týchto zvláštností prostredia poskytuje Lucene FSDirectory.open () metóda. Po vyvolaní sa pokúsi zvoliť najlepšiu implementáciu v závislosti od prostredia.

4. Indexový textový súbor

Po vytvorení adresára indexu poďme do indexu pridať súbor:

public void addFileToIndex (reťazec filepath) {cesta cesty = Paths.get (cesta súboru); Súbor file = path.toFile (); IndexWriterConfig indexWriterConfig = nový IndexWriterConfig (analyzátor); Adresár indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexWriter indexWriter = nový IndexWriter (indexDirectory, indexWriterConfig); Dokumentový dokument = nový dokument (); FileReader fileReader = nový FileReader (súbor); document.add (nový TextField ("obsah", fileReader)); document.add (nový StringField ("cesta", file.getPath (), Field.Store.YES)); document.add (nový StringField ("názov súboru", file.getName (), Field.Store.YES)); indexWriter.addDocument (dokument); indexWriter.close (); }

Tu vytvoríme dokument s dvoma StringFields pomenované „cesta“ a „názov súboru“ a a Textové pole „obsah“.

Všimnite si, že prechádzame okolo fileReader inštancia ako druhý parameter do Textové pole. Dokument je pridaný do indexu pomocou IndexWriter.

Tretí argument v rámci Textové pole alebo StringField konštruktor indikuje, či sa bude ukladať aj hodnota poľa.

Nakoniec privoláme Zavrieť() z IndexWriter elegantne zavrieť a uvoľniť zámok z indexových súborov.

5. Vyhľadajte indexované súbory

Teraz poďme prehľadať súbory, ktoré sme indexovali:

public List searchFiles (String inField, String queryString) {Query query = new QueryParser (inField, analyzer) .parse (queryString); Adresár indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexReader indexReader = DirectoryReader .open (indexDirectory); IndexSearcher searcher = nový IndexSearcher (indexReader); TopDocs topDocs = searcher.search (dopyt, 10); vrátiť topDocs.scoreDocs.stream () .map (scoreDoc -> searcher.doc (scoreDoc.doc)) .collect (Collectors.toList ()); }

Poďme si teraz otestovať funkčnosť:

@Test public void givenSearchQueryWhenFetchedFileNamehenCorrect () {String indexPath = "/ tmp / index"; Reťazec dataPath = "/tmp/data/file1.txt"; Adresárový adresár = FSDirectory .open (Paths.get (indexPath)); LuceneFileSearch luceneFileSearch = nový LuceneFileSearch (adresár, nový StandardAnalyzer ()); luceneFileSearch.addFileToIndex (dataPath); Zoznam dokumentov = luceneFileSearch .searchFiles ("obsah", "consectetur"); assertEquals ("file1.txt", docs.get (0) .get ("názov súboru")); }

Všimnite si, ako vytvárame index systému súborov v umiestnení indexPath a indexovanie file1.txt.

Potom jednoducho hľadáme Stringconsectetur“V „Obsah“ lúka.

6. Záver

Tento článok bol rýchlou ukážkou indexovania a vyhľadávania textu v serveri Apache Lucene. Ak sa chcete dozvedieť viac informácií o indexovaní, opotrebovaní a dotazoch Lucene, prečítajte si náš úvod do článku Lucene.

Ako vždy nájdete kód príkladov na Githube.


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