Lucene - Operasi Pencarian

Proses pencarian adalah salah satu fungsi inti yang disediakan oleh Lucene. Diagram berikut menggambarkan proses dan penggunaannya. IndexSearcher adalah salah satu komponen inti dari proses pencarian.

Pertama-tama kami membuat Direktori yang berisi indeks dan kemudian meneruskannya ke IndexSearcher yang membuka Direktori menggunakan IndexReader . Kemudian kita membuat Query dengan Term dan melakukan pencarian menggunakan IndexSearcher dengan meneruskan Query tersebut ke pencari. IndexSearcher mengembalikan objek TopDocs yang berisi detail pencarian bersama dengan ID dokumen dari Dokumen yang merupakan hasil dari operasi pencarian.

Sekarang kami akan menunjukkan kepada Anda pendekatan langkah-bijaksana dan membantu Anda memahami proses pengindeksan menggunakan contoh dasar.

Buat QueryParser

Kelas QueryParser mem-parsing masukan yang dimasukkan pengguna ke dalam format kueri yang dapat dimengerti Lucene. Ikuti langkah-langkah berikut untuk membuat QueryParser -

Step 1 - Buat objek QueryParser.

Step 2 - Inisialisasi objek QueryParser yang dibuat dengan penganalisis standar yang memiliki informasi versi dan nama indeks tempat kueri ini akan dijalankan.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

   queryParser = new QueryParser(Version.LUCENE_36,
      LuceneConstants.CONTENTS,
      new StandardAnalyzer(Version.LUCENE_36));
}

Buat IndexSearcher

Kelas IndexSearcher bertindak sebagai komponen inti yang dibuat oleh indeks pencari selama proses pengindeksan. Ikuti langkah-langkah berikut untuk membuat IndexSearcher -

Step 1 - Buat objek IndexSearcher.

Step 2 - Buat direktori Lucene yang harus menunjuk ke lokasi di mana indeks akan disimpan.

Step 3 - Inisialisasi objek IndexSearcher yang dibuat dengan direktori indeks.

IndexSearcher indexSearcher;

public Searcher(String indexDirectoryPath) throws IOException {
   Directory indexDirectory = 
      FSDirectory.open(new File(indexDirectoryPath));
   indexSearcher = new IndexSearcher(indexDirectory);
}

Lakukan pencarian

Ikuti langkah-langkah ini untuk melakukan pencarian -

Step 1 - Buat objek Query dengan mengurai ekspresi pencarian melalui QueryParser.

Step 2 - Lakukan pencarian dengan memanggil metode IndexSearcher.search ().

Query query;

public TopDocs search( String searchQuery) throws IOException, ParseException {
   query = queryParser.parse(searchQuery);
   return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}

Dapatkan Dokumennya

Program berikut menunjukkan bagaimana mendapatkan dokumen tersebut.

public Document getDocument(ScoreDoc scoreDoc) 
   throws CorruptIndexException, IOException {
   return indexSearcher.doc(scoreDoc.doc);	
}

Tutup IndexSearcher

Program berikut menunjukkan bagaimana menutup IndexSearcher.

public void close() throws IOException {
   indexSearcher.close();
}

Contoh Aplikasi

Mari kita buat aplikasi uji Lucene untuk menguji proses pencarian.

Langkah Deskripsi
1

Buat proyek dengan nama LuceneFirstApplication di bawah paket com.tutorialspoint.lucene seperti yang dijelaskan di Lucene - bab Aplikasi Pertama . Anda juga dapat menggunakan proyek yang dibuat di Lucene - bab Aplikasi Pertama seperti untuk bab ini untuk memahami proses pencarian.

2

Buat LuceneConstants.java, TextFileFilter.java dan Searcher.java seperti yang dijelaskan di Lucene - bab Aplikasi Pertama . Jaga sisa file tidak berubah.

3

Buat LuceneTester.java seperti yang disebutkan di bawah ini.

4

Bersihkan dan Bangun aplikasi untuk memastikan logika bisnis berfungsi sesuai persyaratan.

LuceneConstants.java

Kelas ini digunakan untuk menyediakan berbagai konstanta yang akan digunakan di seluruh aplikasi sampel.

package com.tutorialspoint.lucene;

public class LuceneConstants {
   public static final String CONTENTS = "contents";
   public static final String FILE_NAME = "filename";
   public static final String FILE_PATH = "filepath";
   public static final int MAX_SEARCH = 10;
}

TextFileFilter.java

Kelas ini digunakan sebagai .txt filter file.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.FileFilter;

public class TextFileFilter implements FileFilter {

   @Override
   public boolean accept(File pathname) {
      return pathname.getName().toLowerCase().endsWith(".txt");
   }
}

Searcher.java

Kelas ini digunakan untuk membaca indeks yang dibuat pada data mentah dan mencari data menggunakan perpustakaan Lucene.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Searcher {
	
   IndexSearcher indexSearcher;
   QueryParser queryParser;
   Query query;

   public Searcher(String indexDirectoryPath) throws IOException {
      Directory indexDirectory = 
         FSDirectory.open(new File(indexDirectoryPath));
      indexSearcher = new IndexSearcher(indexDirectory);
      queryParser = new QueryParser(Version.LUCENE_36,
         LuceneConstants.CONTENTS,
         new StandardAnalyzer(Version.LUCENE_36));
   }

   public TopDocs search( String searchQuery) 
      throws IOException, ParseException {
      query = queryParser.parse(searchQuery);
      return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
   }

   public Document getDocument(ScoreDoc scoreDoc) 
      throws CorruptIndexException, IOException {
      return indexSearcher.doc(scoreDoc.doc);	
   }

   public void close() throws IOException {
      indexSearcher.close();
   }
}

LuceneTester.java

Kelas ini digunakan untuk menguji kemampuan pencarian perpustakaan Lucene.

package com.tutorialspoint.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

public class LuceneTester {
	
   String indexDir = "E:\\Lucene\\Index";
   String dataDir = "E:\\Lucene\\Data";
   Searcher searcher;

   public static void main(String[] args) {
      LuceneTester tester;
      try {
         tester = new LuceneTester();
         tester.search("Mohan");
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException e) {
         e.printStackTrace();
      }
   }

   private void search(String searchQuery) throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      TopDocs hits = searcher.search(searchQuery);
      long endTime = System.currentTimeMillis();

      System.out.println(hits.totalHits +
         " documents found. Time :" + (endTime - startTime) +" ms");
      for(ScoreDoc scoreDoc : hits.scoreDocs) {
         Document doc = searcher.getDocument(scoreDoc);
         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }	
}

Pembuatan Direktori Data & Indeks

Kami telah menggunakan 10 file teks bernama record1.txt ke record10.txt yang berisi nama dan detail siswa lainnya dan meletakkannya di direktori E: \ Lucene \ Data. Uji Data . Jalur direktori indeks harus dibuat sebagai E: \ Lucene \ Index. Setelah menjalankan program pengindeksan di bab tersebutLucene - Indexing Process, Anda dapat melihat daftar file indeks yang dibuat di folder itu.

Menjalankan Program

Setelah Anda selesai dengan pembuatan sumber, data mentah, direktori data, direktori indeks dan indeks, Anda dapat melanjutkan dengan menyusun dan menjalankan program Anda. Untuk melakukan ini, pertahankanLuceneTester.Java file tab aktif dan gunakan opsi Run yang tersedia di Eclipse IDE atau gunakan Ctrl + F11 untuk mengkompilasi dan menjalankan file LuceneTesterapplication. Jika aplikasi Anda berjalan dengan sukses, itu akan mencetak pesan berikut di konsol Eclipse IDE -

1 documents found. Time :29 ms
File: E:\Lucene\Data\record4.txt