Lucene - Hoạt động tìm kiếm

Quá trình tìm kiếm là một trong những chức năng cốt lõi được cung cấp bởi Lucene. Sơ đồ sau minh họa quy trình và việc sử dụng nó. IndexSearcher là một trong những thành phần cốt lõi của quá trình tìm kiếm.

Đầu tiên, chúng tôi tạo (các) Thư mục chứa các chỉ mục và sau đó chuyển nó đến IndexSearcher để mở Thư mục bằng cách sử dụng IndexReader . Sau đó, chúng tôi tạo ra một truy vấn với một hạn và thực hiện một tìm kiếm sử dụng IndexSearcher bằng cách thông qua các truy vấn cho người tìm kiếm. IndexSearcher trả về đối tượng TopDocs chứa các chi tiết tìm kiếm cùng với (các) ID tài liệu của Tài liệu là kết quả của thao tác tìm kiếm.

Bây giờ chúng tôi sẽ chỉ cho bạn một cách tiếp cận khôn ngoan và giúp bạn hiểu quy trình lập chỉ mục bằng cách sử dụng một ví dụ cơ bản.

Tạo một QueryParser

Lớp QueryParser phân tích cú pháp người dùng đã nhập đầu vào thành truy vấn định dạng dễ hiểu Lucene. Làm theo các bước sau để tạo QueryParser -

Step 1 - Tạo đối tượng của QueryParser.

Step 2 - Khởi tạo đối tượng QueryParser được tạo bằng bộ phân tích tiêu chuẩn có thông tin phiên bản và tên chỉ mục mà truy vấn này sẽ được chạy.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

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

Tạo IndexSearcher

Lớp IndexSearcher hoạt động như một thành phần cốt lõi mà người tìm kiếm lập chỉ mục được tạo ra trong quá trình lập chỉ mục. Làm theo các bước sau để tạo IndexSearcher -

Step 1 - Tạo đối tượng của IndexSearcher.

Step 2 - Tạo một thư mục Lucene trỏ đến vị trí lưu trữ các chỉ mục.

Step 3 - Khởi tạo đối tượng IndexSearcher được tạo bằng thư mục chỉ mục.

IndexSearcher indexSearcher;

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

Thực hiện tìm kiếm

Làm theo các bước sau để thực hiện tìm kiếm -

Step 1 - Tạo đối tượng Truy vấn bằng cách phân tích cú pháp biểu thức tìm kiếm thông qua QueryParser.

Step 2 - Thực hiện tìm kiếm bằng cách gọi phương thức IndexSearcher.search ().

Query query;

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

Nhận tài liệu

Chương trình sau đây cho biết cách lấy tài liệu.

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

Đóng IndexSearcher

Chương trình sau đây cho biết cách đóng IndexSearcher.

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

Ứng dụng mẫu

Hãy để chúng tôi tạo một ứng dụng Lucene thử nghiệm để kiểm tra quá trình tìm kiếm.

Bươc Sự miêu tả
1

Tạo một dự án với tên LuceneFirstApplication dưới một gói com.tutorialspoint.lucene như đã giải thích trong chương Lucene - Ứng dụng đầu tiên . Bạn cũng có thể sử dụng dự án được tạo trong chương Lucene - First Application như vậy cho chương này để hiểu quá trình tìm kiếm.

2

Tạo LuceneConstants.java, TextFileFilter.javaSearcher.java như đã giải thích trong chương Lucene - Ứng dụng đầu tiên . Giữ phần còn lại của các tệp không thay đổi.

3

Tạo LuceneTester.java như được đề cập bên dưới.

4

Làm sạch và xây dựng ứng dụng để đảm bảo logic nghiệp vụ đang hoạt động theo yêu cầu.

LuceneConstants.java

Lớp này được sử dụng để cung cấp các hằng số khác nhau được sử dụng trong ứng dụng mẫu.

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

Lớp này được sử dụng như một .txt bộ lọc tệp.

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

Lớp này được sử dụng để đọc các chỉ mục được tạo trên dữ liệu thô và tìm kiếm dữ liệu bằng thư viện 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

Lớp này dùng để kiểm tra khả năng tìm kiếm của thư viện 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();
   }	
}

Tạo thư mục dữ liệu & chỉ mục

Chúng tôi đã sử dụng 10 tệp văn bản có tên record1.txt để ghi10.txt chứa tên và các thông tin chi tiết khác của học sinh và đưa chúng vào thư mục E: \ Lucene \ Data. Dữ liệu thử nghiệm . Đường dẫn thư mục chỉ mục nên được tạo dưới dạng E: \ Lucene \ Index. Sau khi chạy chương trình lập chỉ mục trong chươngLucene - Indexing Process, bạn có thể xem danh sách các tệp chỉ mục được tạo trong thư mục đó.

Chạy chương trình

Khi bạn đã hoàn tất việc tạo nguồn, dữ liệu thô, thư mục dữ liệu, thư mục chỉ mục và các chỉ mục, bạn có thể tiếp tục bằng cách biên dịch và chạy chương trình của mình. Để làm điều này, hãy giữLuceneTester.Java tab tệp đang hoạt động và sử dụng tùy chọn Chạy có sẵn trong IDE Eclipse hoặc sử dụng Ctrl + F11 để biên dịch và chạy LuceneTesterapplication. Nếu ứng dụng của bạn chạy thành công, nó sẽ in thông báo sau trong bảng điều khiển của Eclipse IDE:

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