[java] 아파치 루신(Apache Lucene)을 이용한 복합 조건 검색 구현 방법

아파치 루신(Apache Lucene)은 자바로 개발된 텍스트 검색 엔진입니다. Lucene은 다양한 기능을 제공하며, 그 중에서도 복합 조건 검색은 많은 사용자들에게 유용합니다. 복합 조건 검색은 여러 개의 조건을 조합하여 원하는 검색 결과를 얻을 수 있게 해줍니다. 이번 블로그 포스트에서는 아파치 루신을 이용하여 복합 조건 검색을 구현하는 방법에 대해 알아보겠습니다.

1. 인덱스 생성하기

Lucene을 사용하여 복합 조건 검색을 구현하기 위해서는 먼저 검색할 대상을 색인화해야 합니다. 이를 위해 Lucene의 IndexWriter를 사용하여 인덱스를 생성합니다. 아래는 예시 코드입니다.

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

public class Indexer {

    public void index(String text) throws IOException {
        Directory indexDir = FSDirectory.open(Paths.get("index"));
        IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
        IndexWriter writer = new IndexWriter(indexDir, config);

        Document document = new Document();
        document.add(new TextField("content", text, Field.Store.YES));
        writer.addDocument(document);

        writer.close();
    }
}

위 코드에서 index 메서드는 검색할 문서를 매개변수로 받아 해당 문서를 인덱싱하는 역할을 합니다. TextField를 사용하여 문서의 내용을 색인화하고 IndexWriter를 사용하여 인덱스를 생성합니다. 생성된 인덱스는 indexDir에 저장됩니다.

2. 복합 조건 검색하기

인덱스가 생성되었으면, 이제 복합 조건 검색을 수행할 수 있습니다. Lucene은 IndexSearcherQueryParser를 사용하여 검색을 수행합니다. 아래는 예시 코드입니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.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;

public class Searcher {

    public List<String> search(String queryStr, int numResults) throws IOException, ParseException {
        Directory indexDir = FSDirectory.open(Paths.get("index"));
        IndexReader reader = DirectoryReader.open(indexDir);
        IndexSearcher searcher = new IndexSearcher(reader);
        QueryParser parser = new QueryParser("content", new StandardAnalyzer());
        Query query = parser.parse(queryStr);

        TopDocs topDocs = searcher.search(query, numResults);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        List<String> results = new ArrayList<>();
        for (ScoreDoc scoreDoc : scoreDocs) {
            Document doc = searcher.doc(scoreDoc.doc);
            results.add(doc.get("content"));
        }

        reader.close();
        return results;
    }
}

위 코드에서 search 메서드는 검색어와 검색 결과의 개수를 매개변수로 받아 검색을 수행합니다. IndexSearcher를 사용하여 인덱스를 검색하고, QueryParser를 사용하여 검색어를 파싱합니다. 검색 결과는 TopDocs로 반환되며, scoreDocs에서 결과를 가져와 원하는 형식으로 가공할 수 있습니다.

3. 실행하기

이제 위에서 작성한 IndexerSearcher 클래스를 실행하여 복합 조건 검색을 수행해보겠습니다.

public class Main {

    public static void main(String[] args) throws IOException, ParseException {
        Indexer indexer = new Indexer();
        indexer.index("Hello, Lucene!");

        Searcher searcher = new Searcher();
        List<String> results = searcher.search("Lucene", 10);

        for (String result : results) {
            System.out.println(result);
        }
    }
}

위 코드에서는 Indexer를 사용하여 “Hello, Lucene!”라는 문서를 인덱싱하고, Searcher를 사용하여 “Lucene” 검색어로 복합 조건 검색을 수행합니다. 검색 결과는 콘솔에 출력됩니다.

결론

이번 블로그 포스트에서는 아파치 루신을 이용하여 복합 조건 검색을 구현하는 방법에 대해 알아보았습니다. 복합 조건 검색을 통해 더 정확하고 유용한 검색 결과를 얻을 수 있으며, 아파치 루신의 다양한 기능을 활용하여 검색 엔진을 구현할 수 있습니다. 아파치 루신에 대해 더 자세히 알고 싶다면 공식문서를 참고해보세요.