Egyszerű fájlkeresés a Lucene segítségével

1. Áttekintés

Az Apache Lucene egy teljes szövegű keresőmotor, amelyet különféle programozási nyelvek használhatnak. A Lucene használatának megkezdéséhez kérjük, olvassa el itt a bevezető cikkünket.

Ebben a rövid cikkben indexelünk egy szövegfájlt és keresünk mintát Húrok és szövegrészleteket a fájlban.

2. Maven Setup

Először adjuk hozzá a szükséges függőségeket:

 org.apache.lucene lucene-core 7.1.0 

A legújabb verzió itt található.

A keresési lekérdezések elemzéséhez a következőkre is szükségünk lesz:

 org.apache.lucene lucene-queryparser 7.1.0 

Ne felejtse el itt ellenőrizni a legújabb verziót.

3. Fájlrendszer könyvtár

A fájlok indexeléséhez először létre kell hoznunk egy fájlrendszeri indexet.

Lucene biztosítja a FSDkönyvtár osztály fájlrendszer-index létrehozásához:

Könyvtárkönyvtár = FSDirectory.open (Paths.get (indexPath));

Itt indexPath a könyvtár helye. Ha a könyvtár nem létezik, a Lucene fogja létrehozni.

A Lucene az absztrakt három konkrét megvalósítását biztosítja FSDkönyvtár osztály: SimpleFSDirectory, NIOFSDirectory és MMapDirectory. Mindegyiküknek különleges problémái lehetnek egy adott környezettel.

Például, SimpleFSDirectory gyenge egyidejű teljesítménye, mivel blokkolja, ha több szál olvasható ugyanabból a fájlból.

Hasonlóképpen a NIOFSDirectory és MMapDirectory a megvalósítások fájlcsatorna problémákkal szembesülnek a Windows rendszerben, illetve a memória kiadási problémákkal.

Az ilyen környezeti sajátosságok leküzdésére Lucene biztosítja a FSDirectory.open () módszer. Amikor meghívja, megpróbálja kiválasztani a legjobb megvalósítást a környezettől függően.

4. Index szövegfájl

Miután létrehoztuk az index könyvtárat, folytassuk, és adjunk hozzá egy fájlt az indexhez:

public void addFileToIndex (String filepath) {Elérési útvonal = Paths.get (fájlútvonal); Fájlfájl = path.toFile (); IndexWriterConfig indexWriterConfig = új IndexWriterConfig (elemző); Directory indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexWriter indexWriter = új IndexWriter (indexDirectory, indexWriterConfig); Dokumentumdokumentum = új Dokumentum (); FileReader fileReader = új FileReader (fájl); document.add (új TextField ("tartalom", fileReader)); document.add (új StringField ("elérési út", file.getPath (), Field.Store.YES)); document.add (új StringField ("fájlnév", file.getName (), Field.Store.YES)); indexWriter.addDocument (dokumentum); indexWriter.close (); }

Itt két dokumentumot hozunk létre StringFields elnevezése „útvonal” és „fájlnév”, valamint a TextField úgynevezett „tartalom”.

Ne feledje, hogy elhaladunk a fileReader például a. paraméter második paramétereként TextField. A dokumentum az index segítségével kerül az indexbe IndexWriter.

A harmadik érv a TextField vagy StringField A konstruktor jelzi, hogy a mező értéke is el lesz-e tárolva.

Végül meghívjuk a Bezárás() a IndexWriter hogy kecsesen zárja le és oldja fel a zárat az indexfájlokból.

5. Keresés indexelt fájlokban

Most keressük meg az indexelt fájlokat:

public List searchFiles (String inField, String queryString) {Lekérdezés lekérdezése = new QueryParser (inField, analizátor) .parse (queryString); Directory indexDirectory = FSDirectory .open (Paths.get (indexPath)); IndexReader indexReader = DirectoryReader .open (indexDirectory); IndexSearcher kereső = new IndexSearcher (indexReader); TopDocs topDocs = kereső.keresés (lekérdezés, 10); térjen vissza a topDocs.scoreDocs.stream () .map (scoreDoc -> searcher.doc (scoreDoc.doc)) .collect (Collectors.toList ()); }

Most teszteljük a funkcionalitást:

@Test public void givenSearchQueryWhenFetchedFileNamehenCorrect () {String indexPath = "/ tmp / index"; String dataPath = "/tmp/data/file1.txt"; Könyvtárkönyvtár = FSDirectory .open (Paths.get (indexPath)); LuceneFileSearch luceneFileSearch = new LuceneFileSearch (könyvtár, új StandardAnalyzer ()); luceneFileSearch.addFileToIndex (dataPath); List docs = luceneFileSearch .searchFiles ("tartalom", "consectetur"); assertEquals ("file1.txt", docs.get (0) .get ("fájlnév")); }

Figyelje meg, hogyan hozunk létre fájlrendszer-indexet a helyszínen indexPath és indexeli a file1.txt.

Ezután egyszerűen megkeressük a Húrconsectetur" ban,-ben „Tartalom” terület.

6. Következtetés

Ez a cikk gyors bemutató volt az indexelésről és a szöveg kereséséről az Apache Lucene segítségével. Ha többet szeretne megtudni a Lucene indexeléséről, beolvasásáról és lekérdezéseiről, olvassa el a Lucene cikk bevezetését.

Mint mindig, a példák kódja megtalálható a Github oldalon.