Lucene - Quy trình lập chỉ mục

Quá trình lập chỉ mục 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 quá trình lập chỉ mục và sử dụng các lớp. IndexWriter là thành phần cốt lõi và quan trọng nhất của quá trình lập chỉ mục.

Chúng tôi thêm (các) Tài liệu chứa (các) Trường vào IndexWriter phân tích (các) Tài liệu bằng Trình phân tích và sau đó tạo / mở / chỉnh sửa các chỉ mục theo yêu cầu và lưu trữ / cập nhật chúng trong Thư mục . IndexWriter được sử dụng để cập nhật hoặc tạo chỉ mục. Nó không được sử dụng để đọc các chỉ mục.

Bây giờ chúng tôi sẽ chỉ cho bạn quy trình từng bước để bắt đầu tìm hiểu về 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 tài liệu

  • Tạo một phương thức để lấy một tài liệu lucene từ một tệp văn bản.

  • Tạo các loại trường khác nhau là các cặp giá trị khóa chứa khóa là tên và giá trị là nội dung được lập chỉ mục.

  • Đặt trường được phân tích hoặc không. Trong trường hợp của chúng tôi, chỉ nội dung được phân tích vì nó có thể chứa dữ liệu như a, am, are, v.v. không bắt buộc trong hoạt động tìm kiếm.

  • Thêm các trường mới được tạo vào đối tượng tài liệu và trả nó về phương thức người gọi.

private Document getDocument(File file) throws IOException {
   Document document = new Document();
   
   //index file contents
   Field contentField = new Field(LuceneConstants.CONTENTS, 
      new FileReader(file));
   
   //index file name
   Field fileNameField = new Field(LuceneConstants.FILE_NAME,
      file.getName(),
      Field.Store.YES,Field.Index.NOT_ANALYZED);
   
   //index file path
   Field filePathField = new Field(LuceneConstants.FILE_PATH,
      file.getCanonicalPath(),
      Field.Store.YES,Field.Index.NOT_ANALYZED);

   document.add(contentField);
   document.add(fileNameField);
   document.add(filePathField);

   return document;
}

Tạo một IndexWriter

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

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

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 IndexWriter được tạo bằng thư mục chỉ mục, một trình phân tích tiêu chuẩn có thông tin phiên bản và các tham số bắt buộc / tùy chọn khác.

private IndexWriter writer;

public Indexer(String indexDirectoryPath) throws IOException {
   //this directory will contain the indexes
   Directory indexDirectory = 
      FSDirectory.open(new File(indexDirectoryPath));
   
   //create the indexer
   writer = new IndexWriter(indexDirectory, 
      new StandardAnalyzer(Version.LUCENE_36),true,
      IndexWriter.MaxFieldLength.UNLIMITED);
}

Bắt đầu quá trình lập chỉ mục

Chương trình sau đây cho biết cách bắt đầu quá trình lập chỉ mục:

private void indexFile(File file) throws IOException {
   System.out.println("Indexing "+file.getCanonicalPath());
   Document document = getDocument(file);
   writer.addDocument(document);
}

Ứng dụng mẫu

Để kiểm tra quá trình lập chỉ mục, chúng ta cần tạo một bài kiểm tra ứng dụng Lucene.

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 quy trình lập chỉ mục.

2

Tạo LuceneConstants.java, TextFileFilter.javaIndexer.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");
   }
}

Indexer.java

Lớp này được sử dụng để lập chỉ mục dữ liệu thô để chúng ta có thể tìm kiếm nó bằng thư viện Lucene.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Indexer {

   private IndexWriter writer;

   public Indexer(String indexDirectoryPath) throws IOException {
      //this directory will contain the indexes
      Directory indexDirectory = 
         FSDirectory.open(new File(indexDirectoryPath));

      //create the indexer
      writer = new IndexWriter(indexDirectory, 
         new StandardAnalyzer(Version.LUCENE_36),true,
         IndexWriter.MaxFieldLength.UNLIMITED);
   }

   public void close() throws CorruptIndexException, IOException {
      writer.close();
   }

   private Document getDocument(File file) throws IOException {
      Document document = new Document();

      //index file contents
      Field contentField = new Field(LuceneConstants.CONTENTS, 
         new FileReader(file));
      
      //index file name
      Field fileNameField = new Field(LuceneConstants.FILE_NAME,
         file.getName(),
         Field.Store.YES,Field.Index.NOT_ANALYZED);
      
      //index file path
      Field filePathField = new Field(LuceneConstants.FILE_PATH,
         file.getCanonicalPath(),
         Field.Store.YES,Field.Index.NOT_ANALYZED);

      document.add(contentField);
      document.add(fileNameField);
      document.add(filePathField);

      return document;
   }   

   private void indexFile(File file) throws IOException {
      System.out.println("Indexing "+file.getCanonicalPath());
      Document document = getDocument(file);
      writer.addDocument(document);
   }

   public int createIndex(String dataDirPath, FileFilter filter) 
      throws IOException {
      //get all files in the data directory
      File[] files = new File(dataDirPath).listFiles();

      for (File file : files) {
         if(!file.isDirectory()
            && !file.isHidden()
            && file.exists()
            && file.canRead()
            && filter.accept(file)
         ){
            indexFile(file);
         }
      }
      return writer.numDocs();
   }
}

LuceneTester.java

Lớp này được sử dụng để kiểm tra khả năng lập chỉ mục của thư viện Lucene.

package com.tutorialspoint.lucene;

import java.io.IOException;

public class LuceneTester {
	
   String indexDir = "E:\\Lucene\\Index";
   String dataDir = "E:\\Lucene\\Data";
   Indexer indexer;
   
   public static void main(String[] args) {
      LuceneTester tester;
      try {
         tester = new LuceneTester();
         tester.createIndex();
      } catch (IOException e) {
         e.printStackTrace();
      } 
   }

   private void createIndex() throws IOException {
      indexer = new Indexer(indexDir);
      int numIndexed;
      long startTime = System.currentTimeMillis();	
      numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
      long endTime = System.currentTimeMillis();
      indexer.close();
      System.out.println(numIndexed+" File indexed, time taken: "
         +(endTime-startTime)+" ms");		
   }
}

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 từ record1.txt sang record10.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 . Một đường dẫn thư mục chỉ mục nên được tạo nhưE:\Lucene\Index. Sau khi chạy chương trình này, 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 và thư mụ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. Để thực hiện việc này, hãy giữ cho tab tệp LuceneTester.Java hoạt động và sử dụngRun tùy chọn có sẵn trong IDE Eclipse hoặc sử dụng Ctrl + F11 để biên dịch và chạy LuceneTesterứng dụng. 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:

Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms

Khi bạn đã chạy chương trình thành công, bạn sẽ có nội dung sau trong index directory −