Lucene - Arama İşlemi

Arama süreci, Lucene tarafından sağlanan temel işlevlerden biridir. Aşağıdaki şema süreci ve kullanımını göstermektedir. IndexSearcher, arama sürecinin temel bileşenlerinden biridir.

Önce indeksler içeren Dizin (ler) oluştururuz ve ardından bunu IndexReader kullanarak Dizini açan IndexSearcher'a iletiriz . Sonra bir oluşturmak Sorgu bir ile Süresinin ve kullanarak bir arama yapmak IndexSearcher geçerek Sorgu arayanlar açısından. IndexSearcher bir döner TopDocs belge numarası (ler) ile birlikte ara bilgilerini içeren nesne Belgesi arama işleminin sonucudur.

Şimdi size adım adım bir yaklaşım göstereceğiz ve temel bir örnek kullanarak indeksleme sürecini anlamanıza yardımcı olacağız.

QueryParser oluşturun

QueryParser sınıfı, kullanıcı tarafından girilen girdiyi Lucene anlaşılır biçim sorgusuna ayrıştırır. Bir QueryParser oluşturmak için şu adımları izleyin -

Step 1 - QueryParser nesnesini oluşturun.

Step 2 - Üzerinde bu sorgunun çalıştırılacağı sürüm bilgisi ve dizin adına sahip standart bir analizör ile oluşturulan QueryParser nesnesini başlatın.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

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

Bir IndexSearcher oluşturun

IndexSearcher sınıfı, indeksleme işlemi sırasında oluşturulan arama dizinlerinin temel bir bileşen olarak işlev görür. Bir IndexSearcher oluşturmak için şu adımları izleyin -

Step 1 - IndexSearcher nesnesini oluşturun.

Step 2 - Dizinlerin saklanacağı yeri göstermesi gereken bir Lucene dizini oluşturun.

Step 3 - İndeks dizini ile oluşturulan IndexSearcher nesnesini başlatın.

IndexSearcher indexSearcher;

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

Arama yap

Arama yapmak için şu adımları izleyin -

Step 1 - Arama ifadesini QueryParser aracılığıyla ayrıştırarak bir Query nesnesi oluşturun.

Step 2 - IndexSearcher.search () yöntemini çağırarak arama yapın.

Query query;

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

Belgeyi Alın

Aşağıdaki program belgenin nasıl alınacağını göstermektedir.

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

IndexSearcher'ı kapat

Aşağıdaki program IndexSearcher'ın nasıl kapatılacağını göstermektedir.

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

Örnek Uygulama

Arama sürecini test etmek için bir test Lucene uygulaması oluşturalım.

Adım Açıklama
1

Lucene - İlk Uygulama bölümünde açıklandığı gibi com.tutorialspoint.lucene paketinin altında LuceneFirstApplication adıyla bir proje oluşturun . Arama sürecini anlamak için bu bölüm için Lucene - İlk Uygulama bölümünde oluşturulan projeyi de kullanabilirsiniz .

2

Lucene - İlk Uygulama bölümünde açıklandığı gibi LuceneConstants.java, TextFileFilter.java ve Searcher.java'yı oluşturun . Dosyaların geri kalanını değiştirmeyin.

3

Create LuceneTester.java aşağıda belirtildiği gibi.

4

İş mantığının gereksinimlere göre çalıştığından emin olmak için uygulamayı temizleyin ve oluşturun.

LuceneConstants.java

Bu sınıf, örnek uygulamada kullanılacak çeşitli sabitler sağlamak için kullanılır.

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

Bu sınıf bir .txt dosya filtresi.

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

Bu sınıf, ham veriler üzerinde yapılan indeksleri okumak ve Lucene kütüphanesini kullanarak verileri aramak için kullanılır.

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

Bu sınıf, Lucene kütüphanesinin arama yeteneğini test etmek için kullanılır.

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();
   }	
}

Veri ve Dizin Dizini Oluşturma

Öğrencilerin isimlerini ve diğer detaylarını içeren 10.txt için record1.txt adlı 10 metin dosyası kullandık ve bunları E: \ Lucene \ Data dizinine koyduk. Test Verileri . Bir dizin dizin yolu E: \ Lucene \ Index olarak oluşturulmalıdır. Bölümdeki indeksleme programını çalıştırdıktan sonraLucene - Indexing Process, bu klasörde oluşturulan dizin dosyalarının listesini görebilirsiniz.

Programı Çalıştırmak

Kaynak, ham veri, veri dizini, dizin dizini ve dizinleri oluşturmayı tamamladığınızda, programınızı derleyip çalıştırarak devam edebilirsiniz. Bunu yapmak için tutunLuceneTester.Java dosya sekmesi etkin ve Eclipse IDE'de bulunan Çalıştır seçeneğini kullanın veya Ctrl + F11 derlemek ve çalıştırmak için LuceneTesterapplication. Uygulamanız başarılı bir şekilde çalışırsa, Eclipse IDE'nin konsolunda aşağıdaki mesajı yazdıracaktır -

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