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úr “consectetur" 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.