Lucene-퀵 가이드

Lucene은 간단하면서도 강력한 Java 기반 Search도서관. 모든 애플리케이션에서 검색 기능을 추가하는 데 사용할 수 있습니다. Lucene은 오픈 소스 프로젝트입니다. 확장 가능합니다. 이 고성능 라이브러리는 거의 모든 종류의 텍스트를 색인화하고 검색하는 데 사용됩니다. Lucene 라이브러리는 모든 검색 애플리케이션에 필요한 핵심 작업을 제공합니다. 인덱싱 및 검색.

검색 애플리케이션은 어떻게 작동합니까?

검색 애플리케이션은 다음 작업의 전부 또는 일부를 수행합니다.

단계 표제 기술
1

Acquire Raw Content

검색 응용 프로그램의 첫 번째 단계는 검색 응용 프로그램이 수행 될 대상 콘텐츠를 수집하는 것입니다.

2

Build the document

다음 단계는 검색 애플리케이션이 쉽게 이해하고 해석 할 수있는 원시 컨텐츠에서 문서를 작성하는 것입니다.

Analyze the document

색인화 프로세스가 시작되기 전에 문서의 어느 부분이 색인화 될 후보인지 분석해야합니다. 이 프로세스는 문서가 분석되는 곳입니다.

4

Indexing the document

문서가 작성되고 분석되면 다음 단계는 문서의 전체 내용 대신 특정 키를 기반으로이 문서를 검색 할 수 있도록 문서를 색인화하는 것입니다. 색인화 프로세스는 페이지 번호와 함께 공통 단어가 표시되는 책 끝에있는 색인과 유사하므로 전체 책을 검색하는 대신 이러한 단어를 빠르게 추적 할 수 있습니다.

5

User Interface for Search

색인 데이터베이스가 준비되면 애플리케이션은 모든 검색을 수행 할 수 있습니다. 사용자가 쉽게 검색 할 수 있도록 애플리케이션은 사용자를 제공해야합니다.a mean 또는 a user interface 사용자가 텍스트를 입력하고 검색 프로세스를 시작할 수 있습니다.

6

Build Query

사용자가 텍스트 검색을 요청하면 애플리케이션은 관련 세부 정보를 얻기 위해 인덱스 데이터베이스를 조회하는 데 사용할 수있는 해당 텍스트를 사용하여 Query 객체를 준비해야합니다.

7

Search Query

그런 다음 쿼리 개체를 사용하여 인덱스 데이터베이스를 검사하여 관련 세부 정보와 콘텐츠 문서를 가져옵니다.

8

Render Results

결과가 수신되면 애플리케이션은 사용자 인터페이스를 사용하여 결과를 사용자에게 표시하는 방법을 결정해야합니다. 첫눈에 얼마나 많은 정보가 표시되는지 등.

이러한 기본 작업 외에도 검색 응용 프로그램은 administration user interface애플리케이션 관리자가 사용자 프로필을 기반으로 검색 수준을 제어 할 수 있도록 도와줍니다. 검색 결과 분석은 모든 검색 응용 프로그램의 또 다른 중요하고 고급 기능입니다.

검색 애플리케이션에서 Lucene의 역할

Lucene은 위에서 언급 한 2 ~ 7 단계에서 역할을 수행하고 필요한 작업을 수행하는 클래스를 제공합니다. 간단히 말해서 Lucene은 모든 검색 애플리케이션의 핵심이며 인덱싱 및 검색과 관련된 중요한 작업을 제공합니다. 컨텐츠를 획득하고 결과를 표시하는 것은 애플리케이션 파트가 처리하도록 남겨 둡니다.

다음 장에서는 Lucene 검색 라이브러리를 사용하여 간단한 검색 애플리케이션을 수행합니다.

이 튜토리얼은 Spring Framework로 작업을 시작하기 위해 개발 환경을 준비하는 방법을 안내합니다. 이 튜토리얼은 또한 Spring Framework를 설정하기 전에 컴퓨터에서 JDK, Tomcat 및 Eclipse를 설정하는 방법을 알려줍니다.

1 단계-JDK (Java Development Kit) 설정

Oracle Java 사이트 : Java SE Downloads 에서 최신 버전의 SDK를 다운로드 할 수 있습니다 . 다운로드 한 파일에서 JDK 설치 지침을 찾을 수 있습니다. 주어진 지침에 따라 설정을 설치하고 구성하십시오. 마지막으로 Java 및 javac (일반적으로 각각 java_install_dir / bin 및 java_install_dir)가 포함 된 디렉토리를 참조하도록 PATH 및 JAVA_HOME 환경 변수를 설정하십시오.

Windows를 실행 중이고 C : \ jdk1.6.0_15에 JDK를 설치 한 경우 C : \ autoexec.bat 파일에 다음 행을 입력해야합니다.

set PATH = C:\jdk1.6.0_15\bin;%PATH%
set JAVA_HOME = C:\jdk1.6.0_15

또는 Windows NT / 2000 / XP에서 마우스 오른쪽 버튼으로 클릭 할 수도 있습니다. My Computer, 고르다 Properties, 다음 Advanced, 다음 Environment Variables. 그런 다음PATH 값을 누르고 OK 단추.

Unix (Solaris, Linux 등)에서 SDK가 /usr/local/jdk1.6.0_15에 설치되어 있고 C 셸을 사용하는 경우 .cshrc 파일에 다음을 넣습니다.

setenv PATH /usr/local/jdk1.6.0_15/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.6.0_15

또는 Integrated Development Environment (IDE) Borland JBuilder, Eclipse, IntelliJ IDEA 또는 Sun ONE Studio와 같은 간단한 프로그램을 컴파일하고 실행하여 IDE가 Java를 설치 한 위치를 알고 있는지 확인하고 그렇지 않으면 IDE 문서에 제공된대로 적절한 설정을 수행합니다.

2 단계-Eclipse IDE 설정

이 튜토리얼의 모든 예제는 Eclipse IDE. 따라서 컴퓨터에 최신 버전의 Eclipse가 설치되어 있어야합니다.

Eclipse IDE를 설치하려면 다음에서 최신 Eclipse 바이너리를 다운로드하십시오. https://www.eclipse.org/downloads/. 설치를 다운로드 한 후 편리한 위치에 바이너리 배포판의 압축을 풉니 다. 예를 들어C:\eclipse on windows, 또는 /usr/local/eclipse on Linux/Unix 마지막으로 PATH 변수를 적절하게 설정하십시오.

Eclipse는 Windows 시스템에서 다음 명령을 실행하여 시작하거나 간단히 두 번 클릭 할 수 있습니다. eclipse.exe

%C:\eclipse\eclipse.exe

Eclipse는 Unix (Solaris, Linux 등) 시스템에서 다음 명령을 실행하여 시작할 수 있습니다.

$/usr/local/eclipse/eclipse

성공적으로 시작하면 다음 결과가 표시됩니다.

3 단계-Lucene 프레임 워크 라이브러리 설정

시작에 성공하면 Lucene 프레임 워크 설정을 진행할 수 있습니다. 다음은 시스템에 프레임 워크를 다운로드하고 설치하는 간단한 단계입니다.

https://archive.apache.org/dist/lucene/java/3.6.2/

  • Lucene을 Windows 또는 Unix에 설치할 것인지 선택한 후 다음 단계로 진행하여 Windows 용 .zip 파일과 Unix 용 .tz 파일을 다운로드하십시오.

  • Lucene 프레임 워크 바이너리의 적합한 버전을 다음에서 다운로드하십시오. https://archive.apache.org/dist/lucene/java/.

  • 이 튜토리얼을 작성할 때 Windows 시스템에 lucene-3.6.2.zip을 다운로드했으며 다운로드 한 파일의 압축을 풀면 다음과 같이 C : \ lucene-3.6.2 내부의 디렉토리 구조가 제공됩니다.

디렉토리에서 모든 Lucene 라이브러리를 찾을 수 있습니다. C:\lucene-3.6.2. 이 디렉토리에서 CLASSPATH 변수를 올바르게 설정했는지 확인하십시오. 그렇지 않으면 응용 프로그램을 실행하는 동안 문제가 발생합니다. Eclipse를 사용하는 경우 모든 설정이 Eclipse를 통해 수행되므로 CLASSPATH를 설정할 필요가 없습니다.

이 마지막 단계를 마치면 다음 장에서 보게 될 첫 번째 Lucene 예제를 진행할 준비가 된 것입니다.

이 장에서는 Lucene 프레임 워크를 사용한 실제 프로그래밍을 배웁니다. Lucene 프레임 워크를 사용하여 첫 번째 예제를 작성하기 전에 Lucene-환경 설정 학습서에 설명 된대로 Lucene 환경을 올바르게 설정했는지 확인해야합니다 . Eclipse IDE에 대한 작업 지식이있는 것이 좋습니다.

이제 발견 된 검색 결과 수를 인쇄하는 간단한 검색 응용 프로그램을 작성하여 진행하겠습니다. 이 프로세스 중에 생성 된 인덱스 목록도 볼 수 있습니다.

1 단계-Java 프로젝트 생성

첫 번째 단계는 Eclipse IDE를 사용하여 간단한 Java 프로젝트를 만드는 것입니다. 옵션을 따르십시오File > New -> Project 마지막으로 선택 Java Project마법사 목록에서 마법사. 이제 프로젝트 이름을LuceneFirstApplication 다음과 같이 마법사 창을 사용하여-

프로젝트가 성공적으로 생성되면 다음 콘텐츠가 Project Explorer

2 단계-필요한 라이브러리 추가

이제 프로젝트에 Lucene 핵심 프레임 워크 라이브러리를 추가하겠습니다. 이렇게하려면 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하십시오.LuceneFirstApplication 그런 다음 상황에 맞는 메뉴에서 사용할 수있는 다음 옵션을 따릅니다. Build Path -> Configure Build Path 다음과 같이 Java 빌드 경로 창을 표시하려면-

이제 사용 Add External JARs 아래에서 사용할 수있는 버튼 Libraries Lucene 설치 디렉토리에서 다음 핵심 JAR을 추가하려면 탭-

  • lucene-core-3.6.2

3 단계-소스 파일 생성

이제 실제 소스 파일을 LuceneFirstApplication계획. 먼저 다음과 같은 패키지를 생성해야합니다.com.tutorialspoint.lucene. 이렇게하려면 패키지 탐색기 섹션에서 src를 마우스 오른쪽 버튼으로 클릭하고 옵션을 따르십시오. New -> Package.

다음으로 우리는 LuceneTester.java 및 기타 Java 클래스 com.tutorialspoint.lucene 꾸러미.

LuceneConstants.java

이 클래스는 샘플 애플리케이션에서 사용할 다양한 상수를 제공하는 데 사용됩니다.

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

이 클래스는 .txt 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");
   }
}

Indexer.java

이 클래스는 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();
   }
}

Searcher.java

이 클래스는 요청 된 콘텐츠를 검색하기 위해 인덱서에서 만든 인덱스를 검색하는 데 사용됩니다.

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

이 클래스는 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";
   Indexer indexer;
   Searcher searcher;

   public static void main(String[] args) {
      LuceneTester tester;
      try {
         tester = new LuceneTester();
         tester.createIndex();
         tester.search("Mohan");
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException 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");		
   }

   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));
      for(ScoreDoc scoreDoc : hits.scoreDocs) {
         Document doc = searcher.getDocument(scoreDoc);
            System.out.println("File: "
            + doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }
}

4 단계-데이터 및 색인 디렉토리 생성

우리는 record1.txt에서 10 개의 텍스트 파일을 사용하여 학생의 이름과 기타 세부 정보를 포함하는 record10.txt를 디렉터리에 넣었습니다. E:\Lucene\Data. 테스트 데이터 . 인덱스 디렉토리 경로는 다음과 같이 생성되어야합니다.E:\Lucene\Index. 이 프로그램을 실행하면 해당 폴더에 생성 된 인덱스 파일 목록을 볼 수 있습니다.

5 단계-프로그램 실행

소스, 원시 데이터, 데이터 디렉토리 및 색인 디렉토리 작성이 완료되면 프로그램을 컴파일하고 실행할 준비가 된 것입니다. 이렇게하려면LuceneTester.Java 파일 탭이 활성화되어 있고 Run Eclipse IDE에서 사용 가능한 옵션 또는 Ctrl + F11 컴파일하고 실행하려면 LuceneTester신청. 응용 프로그램이 성공적으로 실행되면 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
1 documents found. Time :0
File: E:\Lucene\Data\record4.txt

프로그램을 성공적으로 실행하면 다음 내용이 index directory

인덱싱 프로세스는 Lucene에서 제공하는 핵심 기능 중 하나입니다. 다음 다이어그램은 인덱싱 프로세스와 클래스 사용을 보여줍니다.IndexWriter 인덱싱 프로세스의 가장 중요하고 핵심 구성 요소입니다.

우리는 추가 Document(s) 포함 Field(s) 분석하는 IndexWriter에 Document(s) 사용하여 Analyzer 그런 다음 필요에 따라 색인을 생성 / 열기 / 편집하고 Directory. IndexWriter는 인덱스를 업데이트하거나 생성하는 데 사용됩니다. 인덱스를 읽는 데 사용되지 않습니다.

인덱싱 클래스

다음은 인덱싱 프로세스 중에 일반적으로 사용되는 클래스 목록입니다.

S. 아니. 클래스 및 설명
1 IndexWriter

이 클래스는 인덱싱 프로세스 중에 인덱스를 생성 / 업데이트하는 핵심 구성 요소 역할을합니다.

2 예배 규칙서

이 클래스는 인덱스의 저장 위치를 ​​나타냅니다.

분석기

이 클래스는 문서를 분석하고 인덱싱 할 텍스트에서 토큰 / 단어를 가져옵니다. 분석이 완료되지 않으면 IndexWriter는 인덱스를 생성 할 수 없습니다.

4 문서

이 클래스는 필드가있는 가상 문서를 나타냅니다. 여기서 Field는 실제 문서의 내용, 메타 데이터 등을 포함 할 수있는 객체입니다. 분석기는 문서 만 이해할 수 있습니다.

5

이것은 인덱싱 프로세스의 가장 낮은 단위 또는 시작점입니다. 인덱싱 할 값을 식별하는 데 키가 사용되는 키 값 쌍 관계를 나타냅니다. 문서의 내용을 나타내는 데 사용되는 필드에 "내용"과 같은 키가 있고 값에 문서의 텍스트 또는 숫자 내용의 일부 또는 전체가 포함될 수 있다고 가정 해 보겠습니다. Lucene은 텍스트 또는 숫자 컨텐츠 만 색인화 할 수 있습니다.

검색 프로세스는 다시 Lucene에서 제공하는 핵심 기능 중 하나입니다. 그 흐름은 인덱싱 프로세스의 흐름과 유사합니다. Lucene의 기본 검색은 모든 검색 관련 작업에 대한 기초 클래스라고도 할 수있는 다음 클래스를 사용하여 수행 할 수 있습니다.

수업 검색

다음은 검색 과정에서 일반적으로 사용되는 클래스 목록입니다.

S. 아니. 클래스 및 설명
1 IndexSearcher

이 클래스는 인덱싱 프로세스 후에 생성 된 인덱스를 읽고 검색하는 핵심 구성 요소 역할을합니다. 색인이 포함 된 위치를 가리키는 디렉토리 인스턴스를 사용합니다.

2 기간

이 클래스는 검색의 가장 낮은 단위입니다. 인덱싱 프로세스의 필드와 유사합니다.

질문

Query는 추상 클래스이며 다양한 유틸리티 메소드를 포함하며 Lucene이 검색 프로세스 중에 사용하는 모든 유형의 쿼리의 상위입니다.

4 TermQuery

TermQuery는 가장 일반적으로 사용되는 쿼리 개체이며 Lucene이 사용할 수있는 많은 복잡한 쿼리의 기반입니다.

5 TopDocs

TopDocs는 검색 기준과 일치하는 상위 N 개의 검색 결과를 가리 킵니다. 검색 결과의 출력 인 문서를 가리키는 포인터의 간단한 컨테이너입니다.

인덱싱 프로세스는 Lucene에서 제공하는 핵심 기능 중 하나입니다. 다음 다이어그램은 인덱싱 프로세스와 클래스 사용을 보여줍니다. IndexWriter는 인덱싱 프로세스에서 가장 중요하고 핵심적인 구성 요소입니다.

Analyzer를 사용하여 문서를 분석 한 다음 필요에 따라 색인 을 생성 / 열기 / 편집 하고 디렉토리 에 저장 / 업데이트하는 IndexWriter에 Field (s) 가 포함 된 문서를 추가 합니다 . IndexWriter 는 인덱스를 업데이트하거나 생성하는 데 사용됩니다. 인덱스를 읽는 데 사용되지 않습니다.

이제 기본 예제를 사용하여 인덱싱 프로세스를 이해하는 데 도움이되는 단계별 프로세스를 보여 드리겠습니다.

문서 작성

  • 텍스트 파일에서 lucene 문서를 가져 오는 메서드를 만듭니다.

  • 색인화 할 내용으로 이름과 값을 포함하는 키 값 쌍인 다양한 유형의 필드를 작성하십시오.

  • 분석 할 필드를 설정합니다. 우리의 경우 검색 작업에 필요하지 않은 a, am, are, 등의 데이터를 포함 할 수 있으므로 콘텐츠 만 분석합니다.

  • 새로 만든 필드를 문서 개체에 추가하고 호출자 메서드에 반환합니다.

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

IndexWriter 만들기

IndexWriter 클래스는 인덱싱 프로세스 중에 인덱스를 생성 / 업데이트하는 핵심 구성 요소 역할을합니다. IndexWriter를 생성하려면 다음 단계를 따르십시오-

Step 1 − IndexWriter의 개체를 생성합니다.

Step 2 − 색인이 저장 될 위치를 가리켜 야하는 Lucene 디렉토리를 만듭니다.

Step 3 − 버전 정보 및 기타 필수 / 선택적 매개 변수가있는 표준 분석기 인 색인 디렉토리로 생성 된 IndexWriter 개체를 초기화합니다.

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

인덱싱 프로세스 시작

다음 프로그램은 인덱싱 프로세스를 시작하는 방법을 보여줍니다-

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

예제 애플리케이션

인덱싱 프로세스를 테스트하려면 Lucene 애플리케이션 테스트를 만들어야합니다.

단계 기술
1

Lucene-First Application 장에 설명 된대로 com.tutorialspoint.lucene 패키지 아래에 LuceneFirstApplication 이라는 이름으로 프로젝트를 작성하십시오 . 인덱싱 프로세스를 이해하기 위해 Lucene-첫 번째 애플리케이션 장 에서 작성된 프로젝트를 사용할 수도 있습니다 .

2

만들기 LuceneConstants.java, TextFileFilter.javaIndexer.java 에 설명 된대로 첫 번째 응용 프로그램 - 루씬 장. 나머지 파일은 변경하지 마십시오.

아래 언급 된대로 LuceneTester.java 를 작성하십시오 .

4

애플리케이션을 정리하고 빌드하여 비즈니스 로직이 요구 사항에 따라 작동하는지 확인하십시오.

LuceneConstants.java

이 클래스는 샘플 애플리케이션에서 사용할 다양한 상수를 제공하는 데 사용됩니다.

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

이 클래스는 .txt 파일 필터.

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

이 클래스는 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

이 클래스는 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");		
   }
}

데이터 및 인덱스 디렉토리 생성

우리는 record1.txt에서 10 개의 텍스트 파일을 사용하여 학생의 이름과 기타 세부 정보를 포함하는 record10.txt를 디렉터리에 넣었습니다. E:\Lucene\Data. 테스트 데이터 . 인덱스 디렉토리 경로는 다음과 같이 생성되어야합니다.E:\Lucene\Index. 이 프로그램을 실행하면 해당 폴더에 생성 된 인덱스 파일 목록을 볼 수 있습니다.

프로그램 실행

소스, 원시 데이터, 데이터 디렉토리 및 색인 디렉토리 작성이 완료되면 프로그램을 컴파일하고 실행하여 진행할 수 있습니다. 이를 수행하려면 LuceneTester.Java 파일 탭을 활성 상태로 유지하고Run Eclipse IDE에서 사용 가능한 옵션 또는 Ctrl + F11 컴파일하고 실행하려면 LuceneTester신청. 응용 프로그램이 성공적으로 실행되면 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

프로그램을 성공적으로 실행하면 다음 내용이 index directory −

이 장에서는 인덱싱의 네 가지 주요 작업에 대해 설명합니다. 이러한 작업은 다양한 시간에 유용하며 소프트웨어 검색 응용 프로그램 전체에서 사용됩니다.

인덱싱 작업

다음은 인덱싱 프로세스 중에 일반적으로 사용되는 작업 목록입니다.

S. 아니. 작동 및 설명
1 문서 추가

이 작업은 인덱싱 프로세스의 초기 단계에서 새로 사용 가능한 콘텐츠에 대한 인덱스를 만드는 데 사용됩니다.

2 문서 업데이트

이 작업은 업데이트 된 내용의 변경 사항을 반영하기 위해 인덱스를 업데이트하는 데 사용됩니다. 인덱스를 다시 만드는 것과 비슷합니다.

문서 삭제

이 작업은 색인화 / 검색 할 필요가없는 문서를 제외하도록 색인을 업데이트하는 데 사용됩니다.

4 필드 옵션

필드 옵션은 필드의 내용을 검색 할 수있는 방법을 지정하거나 제어합니다.

검색 프로세스는 Lucene에서 제공하는 핵심 기능 중 하나입니다. 다음 다이어그램은 프로세스와 그 사용을 보여줍니다. IndexSearcher는 검색 프로세스의 핵심 구성 요소 중 하나입니다.

먼저 인덱스를 포함하는 Directory (s) 를 만든 다음 IndexReader를 사용 하여 Directory 를 여는 IndexSearcher에 전달합니다 . 그런 다음 용어쿼리 를 만들고 쿼리 를 검색 자에게 전달 하여 IndexSearcher 를 사용 하여 검색합니다. IndexSearcher 는 검색 작업의 결과 인 문서 의 문서 ID와 함께 검색 세부 정보를 포함 하는 TopDocs 개체를 반환 합니다.

이제 단계별 접근 방식을 보여주고 기본 예제를 사용하여 인덱싱 프로세스를 이해하는 데 도움이됩니다.

QueryParser 만들기

QueryParser 클래스는 Lucene이 이해할 수있는 형식 쿼리에 사용자가 입력 한 입력을 구문 분석합니다. QueryParser를 생성하려면 다음 단계를 따르십시오-

Step 1 − QueryParser의 객체를 생성합니다.

Step 2 −이 쿼리가 실행될 버전 정보와 인덱스 이름이있는 표준 분석기로 생성 된 QueryParser 객체를 초기화합니다.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

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

IndexSearcher 만들기

IndexSearcher 클래스는 인덱싱 프로세스 중에 생성되는 검색자가 인덱싱하는 핵심 구성 요소 역할을합니다. IndexSearcher를 생성하려면 다음 단계를 따르십시오-

Step 1 − IndexSearcher의 객체를 생성합니다.

Step 2 − 색인이 저장 될 위치를 가리켜 야하는 Lucene 디렉토리를 만듭니다.

Step 3 − 인덱스 디렉토리로 생성 된 IndexSearcher 객체를 초기화합니다.

IndexSearcher indexSearcher;

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

검색하기

검색하려면 다음 단계를 따르십시오-

Step 1 − QueryParser를 통해 검색 표현식을 구문 분석하여 Query 객체를 생성합니다.

Step 2 − IndexSearcher.search () 메서드를 호출하여 검색합니다.

Query query;

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

IndexSearcher 닫기

다음 프로그램은 IndexSearcher를 닫는 방법을 보여줍니다.

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

예제 애플리케이션

검색 프로세스를 테스트하기 위해 테스트 Lucene 애플리케이션을 작성하겠습니다.

단계 기술
1

Lucene-First Application 장에 설명 된대로 com.tutorialspoint.lucene 패키지 아래에 이름이 LuceneFirstApplication 인 프로젝트를 작성하십시오 . 또한 Lucene-First Application 장 에서 만든 프로젝트 를이 장에서 검색 프로세스를 이해하는 데 사용할 수 있습니다 .

2

Lucene- 첫 번째 애플리케이션 장에 설명 된대로 LuceneConstants.java, TextFileFilter.javaSearcher.java 를 작성하십시오 . 나머지 파일은 변경하지 마십시오.

아래 언급 된대로 LuceneTester.java 를 작성하십시오 .

4

애플리케이션을 정리하고 빌드하여 비즈니스 논리가 요구 사항에 따라 작동하는지 확인합니다.

LuceneConstants.java

이 클래스는 샘플 애플리케이션에서 사용할 다양한 상수를 제공하는 데 사용됩니다.

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

이 클래스는 .txt 파일 필터.

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

이 클래스는 원시 데이터에 작성된 색인을 읽고 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

이 클래스는 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();
   }	
}

데이터 및 인덱스 디렉토리 생성

우리는 학생의 이름과 기타 세부 사항을 포함하는 record10.txt에 record1.txt라는 10 개의 텍스트 파일을 사용하여 E : \ Lucene \ Data 디렉토리에 넣었습니다. 테스트 데이터 . 색인 디렉토리 경로는 E : \ Lucene \ Index로 작성되어야합니다. 장의 인덱싱 프로그램을 실행 한 후Lucene - Indexing Process, 해당 폴더에 생성 된 색인 파일 목록을 볼 수 있습니다.

프로그램 실행

소스, 원시 데이터, 데이터 디렉토리, 색인 디렉토리 및 색인 작성이 완료되면 프로그램을 컴파일하고 실행하여 진행할 수 있습니다. 이렇게하려면 계속LuceneTester.Java 파일 탭을 활성화하고 Eclipse IDE에서 사용 가능한 실행 옵션을 사용하거나 Ctrl + F11 컴파일하고 실행하려면 LuceneTesterapplication. 응용 프로그램이 성공적으로 실행되면 Eclipse IDE의 콘솔에 다음 메시지가 인쇄됩니다.

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

우리는 이전 장에서 보았습니다 Lucene - Search Operation, Lucene은 IndexSearcher를 사용하여 검색을하고 QueryParser에서 생성 한 Query 객체를 입력으로 사용합니다. 이 장에서는 다양한 유형의 Query 객체와이를 프로그래밍 방식으로 생성하는 다양한 방법에 대해 설명합니다. 다양한 유형의 Query 객체를 생성하면 검색 유형을 제어 할 수 있습니다.

사용자에게 검색 결과를 제한하는 여러 옵션이 제공되는 많은 애플리케이션에서 제공하는 고급 검색의 경우를 고려하십시오. 쿼리 프로그래밍을 통해 우리는 매우 쉽게 동일한 결과를 얻을 수 있습니다.

다음은 당분간 논의 할 쿼리 유형 목록입니다.

S. 아니. 클래스 및 설명
1 TermQuery

이 클래스는 인덱싱 프로세스 중에 인덱스를 생성 / 업데이트하는 핵심 구성 요소 역할을합니다.

2 TermRangeQuery

TermRangeQuery는 텍스트 용어 범위를 검색 할 때 사용됩니다.

PrefixQuery

PrefixQuery는 색인이 지정된 문자열로 시작하는 문서를 일치시키는 데 사용됩니다.

4 BooleanQuery

BooleanQuery는 다음을 사용하여 여러 쿼리의 결과 인 문서를 검색하는 데 사용됩니다. AND, OR 또는 NOT 연산자.

5 PhraseQuery

구문 쿼리는 특정 용어 시퀀스가 ​​포함 된 문서를 검색하는 데 사용됩니다.

6 WildCardQuery

WildcardQuery는 문자 시퀀스에 대해 '*'와 같은 와일드 카드를 사용하여 문서를 검색하는 데 사용됩니다. 단일 문자와 일치합니다.

7 FuzzyQuery

FuzzyQuery는 편집 거리 알고리즘을 기반으로하는 대략적인 검색 인 퍼지 구현을 사용하여 문서를 검색하는 데 사용됩니다.

8 MatchAllDocsQuery

이름에서 알 수 있듯이 MatchAllDocsQuery는 모든 문서와 일치합니다.

이전 장 중 하나에서 Lucene이 IndexWriter 를 사용하여 Analyzer를 사용하여 문서 를 분석 한 다음 필요에 따라 색인을 생성 / 열기 / 편집 하는 것을 보았습니다 . 이 장에서는 분석 과정에서 사용되는 다양한 유형의 Analyzer 개체 및 기타 관련 개체에 대해 설명합니다. 분석 프로세스와 분석기 작동 방식을 이해하면 Lucene이 문서를 인덱싱하는 방법에 대한 훌륭한 통찰력을 얻을 수 있습니다.

다음은 당연히 논의 할 개체 목록입니다.

S. 아니. 클래스 및 설명
1 토큰

토큰은 메타 데이터 (위치, 시작 오프셋, 끝 오프셋, 토큰 유형 및 위치 증분)와 같은 관련 세부 정보가있는 문서의 텍스트 또는 단어를 나타냅니다.

2 TokenStream

TokenStream은 분석 프로세스의 출력이며 일련의 토큰으로 구성됩니다. 추상 클래스입니다.

분석기

이것은 모든 유형의 Analyzer에 대한 추상 기본 클래스입니다.

4 공백 분석기

이 분석기는 공백을 기준으로 문서의 텍스트를 분할합니다.

5 SimpleAnalyzer

이 분석기는 문자가 아닌 문자를 기반으로 문서의 텍스트를 분할하고 텍스트를 소문자로 표시합니다.

6 StopAnalyzer

이 분석기는 SimpleAnalyzer처럼 작동하며 다음과 같은 일반적인 단어를 제거합니다. 'a', 'an', 'the', 기타

7 StandardAnalyzer

이것은 가장 정교한 분석기이며 이름, 이메일 주소 등을 처리 할 수 ​​있습니다. 각 토큰을 소문자로하고 일반적인 단어와 구두점 (있는 경우)을 제거합니다.

이 장에서는 Lucene이 기본적으로 검색 결과를 제공하거나 필요에 따라 조작 할 수있는 정렬 순서를 살펴 보겠습니다.

관련성에 따라 정렬

Lucene에서 사용하는 기본 정렬 모드입니다. Lucene은 상단에서 가장 관련성이 높은 히트별로 결과를 제공합니다.

private void sortUsingRelevance(String searchQuery)
   throws IOException, ParseException {
   searcher = new Searcher(indexDir);
   long startTime = System.currentTimeMillis();
   
   //create a term to search file name
   Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
   //create the term query object
   Query query = new FuzzyQuery(term);
   searcher.setDefaultFieldSortScoring(true, false);
   //do the search
   TopDocs hits = searcher.search(query,Sort.RELEVANCE);
   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.print("Score: "+ scoreDoc.score + " ");
      System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
   }
   searcher.close();
}

IndexOrder로 정렬

이 정렬 모드는 Lucene에서 사용됩니다. 여기에서 색인 된 첫 번째 문서가 검색 결과에 먼저 표시됩니다.

private void sortUsingIndex(String searchQuery)
   throws IOException, ParseException {
   searcher = new Searcher(indexDir);
   long startTime = System.currentTimeMillis();
   
   //create a term to search file name
   Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
   //create the term query object
   Query query = new FuzzyQuery(term);
   searcher.setDefaultFieldSortScoring(true, false);
   //do the search
   TopDocs hits = searcher.search(query,Sort.INDEXORDER);
   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.print("Score: "+ scoreDoc.score + " ");
      System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
   }
   searcher.close();
}

예제 애플리케이션

정렬 프로세스를 테스트하기 위해 테스트 Lucene 애플리케이션을 작성하겠습니다.

단계 기술
1

Lucene-First Application 장에 설명 된대로 com.tutorialspoint.lucene 패키지 아래에 이름이 LuceneFirstApplication 인 프로젝트를 작성하십시오 . 또한 Lucene-First Application 장 에서 만든 프로젝트 를이 장에서 검색 프로세스를 이해하는 데 사용할 수 있습니다 .

2

Lucene- 첫 번째 애플리케이션 장에 설명 된대로 LuceneConstants.javaSearcher.java 를 작성하십시오 . 나머지 파일은 변경하지 마십시오.

아래 언급 된대로 LuceneTester.java 를 작성하십시오 .

4

응용 프로그램을 정리하고 빌드하여 비즈니스 논리가 요구 사항에 따라 작동하는지 확인합니다.

LuceneConstants.java

이 클래스는 샘플 애플리케이션에서 사용할 다양한 상수를 제공하는 데 사용됩니다.

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

Searcher.java

이 클래스는 원시 데이터에 작성된 색인을 읽고 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.Sort;
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 TopDocs search(Query query) 
      throws IOException, ParseException {
      return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
   }

   public TopDocs search(Query query,Sort sort) 
      throws IOException, ParseException {
      return indexSearcher.search(query, 
         LuceneConstants.MAX_SEARCH,sort);
   }

   public void setDefaultFieldSortScoring(boolean doTrackScores, 
      boolean doMaxScores) {
      indexSearcher.setDefaultFieldSortScoring(
         doTrackScores,doMaxScores);
   }

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

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

LuceneTester.java

이 클래스는 Lucene 라이브러리의 검색 기능을 테스트하는 데 사용됩니다.

package com.tutorialspoint.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;

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

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

   private void sortUsingRelevance(String searchQuery)
      throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      
      //create a term to search file name
      Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
      //create the term query object
      Query query = new FuzzyQuery(term);
      searcher.setDefaultFieldSortScoring(true, false);
      //do the search
      TopDocs hits = searcher.search(query,Sort.RELEVANCE);
      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.print("Score: "+ scoreDoc.score + " ");
         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }

   private void sortUsingIndex(String searchQuery)
      throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      //create a term to search file name
      Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
      //create the term query object
      Query query = new FuzzyQuery(term);
      searcher.setDefaultFieldSortScoring(true, false);
      //do the search
      TopDocs hits = searcher.search(query,Sort.INDEXORDER);
      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.print("Score: "+ scoreDoc.score + " ");
         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }
}

데이터 및 인덱스 디렉토리 생성

우리는 record1.txt에서 10 개의 텍스트 파일을 사용하여 학생의 이름과 기타 세부 정보를 포함하는 record10.txt를 디렉터리에 넣었습니다. E:\Lucene\Data. 테스트 데이터 . 색인 디렉토리 경로는 E : \ Lucene \ Index로 작성되어야합니다. 장의 인덱싱 프로그램을 실행 한 후Lucene - Indexing Process, 해당 폴더에 생성 된 색인 파일 목록을 볼 수 있습니다.

프로그램 실행

소스, 원시 데이터, 데이터 디렉토리, 색인 디렉토리 및 색인 작성이 완료되면 프로그램을 컴파일하고 실행할 수 있습니다. 이렇게하려면LuceneTester.Java 파일 탭을 활성화하고 Eclipse IDE에서 사용 가능한 실행 옵션을 사용하거나 Ctrl + F11 컴파일하고 실행하려면 LuceneTester신청. 응용 프로그램이 성공적으로 실행되면 Eclipse IDE의 콘솔에 다음 메시지가 인쇄됩니다.

10 documents found. Time :31ms
Score: 1.3179655 File: E:\Lucene\Data\record3.txt
Score: 0.790779 File: E:\Lucene\Data\record1.txt
Score: 0.790779 File: E:\Lucene\Data\record2.txt
Score: 0.790779 File: E:\Lucene\Data\record4.txt
Score: 0.790779 File: E:\Lucene\Data\record5.txt
Score: 0.790779 File: E:\Lucene\Data\record6.txt
Score: 0.790779 File: E:\Lucene\Data\record7.txt
Score: 0.790779 File: E:\Lucene\Data\record8.txt
Score: 0.790779 File: E:\Lucene\Data\record9.txt
Score: 0.2635932 File: E:\Lucene\Data\record10.txt
10 documents found. Time :0ms
Score: 0.790779 File: E:\Lucene\Data\record1.txt
Score: 0.2635932 File: E:\Lucene\Data\record10.txt
Score: 0.790779 File: E:\Lucene\Data\record2.txt
Score: 1.3179655 File: E:\Lucene\Data\record3.txt
Score: 0.790779 File: E:\Lucene\Data\record4.txt
Score: 0.790779 File: E:\Lucene\Data\record5.txt
Score: 0.790779 File: E:\Lucene\Data\record6.txt
Score: 0.790779 File: E:\Lucene\Data\record7.txt
Score: 0.790779 File: E:\Lucene\Data\record8.txt
Score: 0.790779 File: E:\Lucene\Data\record9.txt