Pencarian File Sederhana dengan Lucene

1. Ikhtisar

Apache Lucene adalah mesin pencari teks lengkap, yang dapat digunakan oleh berbagai bahasa pemrograman. Untuk memulai dengan Lucene, lihat artikel pengantar kami di sini.

Dalam artikel singkat ini, kami akan mengindeks file teks dan menelusuri contoh String dan cuplikan teks di dalam file itu.

2. Pengaturan Maven

Mari tambahkan dependensi yang diperlukan terlebih dahulu:

 org.apache.lucene lucene-core 7.1.0 

Versi terbaru dapat ditemukan di sini.

Selain itu, untuk mengurai kueri penelusuran kami, kami memerlukan:

 org.apache.lucene lucene-queryparser 7.1.0 

Ingatlah untuk memeriksa versi terbaru di sini.

3. Direktori Sistem File

Untuk mengindeks file, pertama-tama kita perlu membuat indeks sistem file.

Lucene menyediakan kelas FSDirectory untuk membuat indeks sistem file:

Directory directory = FSDirectory.open(Paths.get(indexPath));

Di sini indexPath adalah lokasi direktori. Jika direktori tidak ada, Lucene akan membuatnya.

Lucene menyediakan tiga implementasi konkret dari kelas FSDirectory abstrak : SimpleFSDirectory, NIOFSDirectory, dan MMapDirectory. Masing-masing mungkin memiliki masalah khusus dengan lingkungan tertentu.

Misalnya, SimpleFSDirectory memiliki kinerja bersamaan yang buruk karena memblokir ketika beberapa utas membaca dari file yang sama.

Demikian pula, implementasi NIOFSDirectory dan MMapDirectory menghadapi masalah saluran file di Windows dan masalah rilis memori masing-masing.

Untuk mengatasi kekhasan lingkungan seperti itu, Lucene menyediakan metode FSDirectory.open () . Saat dipanggil, ia mencoba memilih implementasi terbaik tergantung pada lingkungannya.

4. Indeks File Teks

Setelah kita membuat direktori index, mari lanjutkan dan tambahkan file ke index:

public void addFileToIndex(String filepath) { Path path = Paths.get(filepath); File file = path.toFile(); IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); Directory indexDirectory = FSDirectory .open(Paths.get(indexPath)); IndexWriter indexWriter = new IndexWriter( indexDirectory, indexWriterConfig); Document document = new Document(); FileReader fileReader = new FileReader(file); document.add( new TextField("contents", fileReader)); document.add( new StringField("path", file.getPath(), Field.Store.YES)); document.add( new StringField("filename", file.getName(), Field.Store.YES)); indexWriter.addDocument(document); indexWriter.close(); }

Di sini, kami membuat dokumen dengan dua StringFields bernama "path" dan "filename" dan TextField yang disebut "konten".

Perhatikan bahwa kami meneruskan instance fileReader sebagai parameter kedua ke TextField . Dokumen ditambahkan ke indeks menggunakan IndexWriter.

Argumen ketiga dalam konstruktor TextField atau StringField menunjukkan apakah nilai bidang juga akan disimpan.

Akhirnya, kita memanggil close () dari IndexWriter untuk menutup dan melepaskan kunci dari file indeks dengan baik.

5. Cari File Terindeks

Sekarang mari cari file yang telah kami indeks:

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 = new IndexSearcher(indexReader); TopDocs topDocs = searcher.search(query, 10); return topDocs.scoreDocs.stream() .map(scoreDoc -> searcher.doc(scoreDoc.doc)) .collect(Collectors.toList()); }

Sekarang mari kita uji fungsionalitasnya:

@Test public void givenSearchQueryWhenFetchedFileNamehenCorrect(){ String indexPath = "/tmp/index"; String dataPath = "/tmp/data/file1.txt"; Directory directory = FSDirectory .open(Paths.get(indexPath)); LuceneFileSearch luceneFileSearch = new LuceneFileSearch(directory, new StandardAnalyzer()); luceneFileSearch.addFileToIndex(dataPath); List docs = luceneFileSearch .searchFiles("contents", "consectetur"); assertEquals("file1.txt", docs.get(0).get("filename")); }

Perhatikan bagaimana kita membuat indeks sistem file di lokasi indexPath dan mengindeks file1.txt.

Kemudian, kita cukup mencari String " consectetur " di kolom "konten" .

6. Kesimpulan

Artikel ini adalah demonstrasi singkat tentang pengindeksan dan penelusuran teks dengan Apache Lucene. Untuk mempelajari lebih lanjut tentang pengindeksan, pemusnahan, dan kueri Lucene, lihat pengantar artikel Lucene kami.

Seperti biasa, kode untuk contoh dapat ditemukan di Github.