[java] 아파치 루신(Apache Lucene)을 이용한 범위 기반 검색 구현 방법

아파치 루신은 자바 기반의 오픈 소스 정보 검색 라이브러리로, 텍스트 기반의 데이터를 색인화하고 검색하는 기능을 제공합니다. 이 라이브러리를 사용하여 범위 기반 검색을 구현하는 방법을 알아보겠습니다.

1. 루신 색인 생성

먼저 루신 색인을 생성해야 합니다. 이를 위해 다음 단계를 따릅니다:

  1. 루신 색인 디렉토리 생성:
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

Directory indexDirectory = FSDirectory.open(Paths.get("index"));
  1. 루신 색인 작성기 생성:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;

Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(indexDirectory, config);
  1. 색인 대상 문서를 생성하여 색인 작성기에 추가:
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;

Document document = new Document();
document.add(new TextField("title", "문서 제목 1", Field.Store.YES));
document.add(new TextField("content", "문서 내용 1", Field.Store.YES));

indexWriter.addDocument(document);
  1. 색인 작성기를 닫고 색인 디렉토리를 닫습니다:
indexWriter.close();
indexDirectory.close();

이렇게 하면 루신 색인이 생성됩니다.

2. 범위 기반 검색 수행

이제 생성된 루신 색인을 사용하여 범위 기반 검색을 수행할 수 있습니다. 다음은 예제 코드입니다:

import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;

// 루신 색인 디렉토리 오픈
Directory indexDirectory = FSDirectory.open(Paths.get("index"));
IndexReader indexReader = DirectoryReader.open(indexDirectory);

// 검색기 생성
IndexSearcher indexSearcher = new IndexSearcher(indexReader);

// 검색어 파서 생성
Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("content", analyzer);

// 검색어 쿼리 생성
Query query = queryParser.parse("content:검색어");

// 범위 쿼리 생성
TermRangeQuery rangeQuery = TermRangeQuery.newStringRange("title", "문서 제목 1", "문서 제목 5", true, true);

// 쿼리 조합
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
booleanQuery.add(query, BooleanClause.Occur.MUST);
booleanQuery.add(rangeQuery, BooleanClause.Occur.MUST);

// 검색 실행
TopDocs topDocs = indexSearcher.search(booleanQuery.build(), 10);

// 검색 결과 처리
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
    Document document = indexSearcher.doc(scoreDoc.doc);
    System.out.println(document.get("title"));
}

// 리소스 해제
indexReader.close();
indexDirectory.close();

위 코드에서 “content” 필드를 기준으로 “검색어”가 포함된 문서를 “title” 필드의 값이 “문서 제목 1”부터 “문서 제목 5” 사이인 범위에서 검색합니다. 검색 결과는 상위 10개의 문서를 가져옵니다.

이와 같이 아파치 루신을 사용하여 범위 기반 검색을 구현할 수 있습니다. 추가적으로 필요한 기능이나 설정에 따라 코드를 수정하여 사용할 수 있습니다.

참고 자료

이상입니다. 감사합니다!