[java] 아파치 루신(Apache Lucene)을 활용한 연관 검색 기능의 구현 방법

아파치 루신(Apache Lucene)은 자바 기반의 오픈 소스 검색 엔진 라이브러리로, 전문 검색 기능을 제공합니다. 이 라이브러리를 활용하여 연관 검색 기능을 구현하는 방법에 대해 알아보겠습니다.

1. Lucene 인덱스 생성

Lucene을 사용하기 위해 먼저 인덱스를 생성해야 합니다. 이 인덱스는 검색할 텍스트 데이터를 기반으로 생성됩니다. 아래는 Lucene 인덱스를 생성하는 예시 코드입니다.

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

// ...

// 인덱스를 저장할 디렉토리 설정
Directory directory = FSDirectory.open(Paths.get("/path/to/index/directory"));

// 분석기 설정
Analyzer analyzer = new StandardAnalyzer();

// 인덱스 라이터 생성
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);

// 검색 대상 데이터를 Document로 변환하여 인덱스에 추가
Document doc1 = new Document();
doc1.add(new Field("id", "1", StringField.TYPE_STORED));
doc1.add(new Field("content", "검색할 데이터 1", TextField.TYPE_STORED));
writer.addDocument(doc1);

Document doc2 = new Document();
doc2.add(new Field("id", "2", StringField.TYPE_STORED));
doc2.add(new Field("content", "검색할 데이터 2", TextField.TYPE_STORED));
writer.addDocument(doc2);
// ...

// 인덱스 라이터 닫기
writer.close();

위 코드에서는 StandardAnalyzer를 사용하여 텍스트를 분석하고, TextField를 사용하여 인덱스를 생성합니다. “content” 필드에는 검색할 데이터를 추가하고, “id” 필드에는 각 데이터의 고유 ID를 저장합니다.

2. 검색 기능 구현

인덱스를 생성한 후에는 이를 기반으로 검색 기능을 구현할 수 있습니다. 아래는 Lucene을 사용하여 연관 검색 기능을 구현하는 예시 코드입니다.

import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
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.queryparser.classic.QueryParser;

// ...

// 인덱스 디렉토리 설정
Directory directory = FSDirectory.open(Paths.get("/path/to/index/directory"));

// 인덱스 리더 생성
IndexReader reader = DirectoryReader.open(directory);

// 인덱스 서처 생성
IndexSearcher searcher = new IndexSearcher(reader);

// 검색어 설정
String queryString = "검색할 키워드";
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(queryString);

// 검색 실행
TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] hits = topDocs.scoreDocs;

// 검색 결과 출력
for (ScoreDoc hit : hits) {
  int docId = hit.doc;
  Document doc = searcher.doc(docId);
  System.out.println("ID: " + doc.getField("id").stringValue());
  System.out.println("Content: " + doc.getField("content").stringValue());
}

// 검색 리더 닫기
reader.close();

위 코드에서는 IndexReader를 사용하여 인덱스를 읽어오고, IndexSearcher를 생성하여 검색을 수행합니다. 검색어는 QueryParser를 사용하여 파싱하여 Query 객체를 생성하고, searcher.search() 메서드를 호출하여 검색을 실행합니다. 검색 결과는 TopDocs 객체로 반환되고, hits 배열을 순회하여 각 문서의 필드 값을 가져와 출력합니다.

결론

위에서는 아파치 루신을 사용하여 연관 검색 기능을 구현하는 방법에 대해 알아보았습니다. Lucene은 강력한 검색 엔진 라이브러리이기 때문에 다양한 검색 기능을 구현할 수 있습니다. 자세한 사용법은 공식 문서나 관련 자료를 참고하시기 바랍니다.

참고 자료