[java] 아파치 루신(Apache Lucene)을 이용한 검색 결과의 시간순 정렬 방법

아파치 루신(Apache Lucene)은 대표적인 오픈 소스 검색 라이브러리로, 텍스트 문서를 색인화하여 검색 기능을 제공합니다. 이때 검색 결과를 시간순으로 정렬하는 방법에 대해 알아보겠습니다.

1. 문서 색인화

우선, 검색 대상이 되는 문서를 아파치 루신의 인덱스로 색인화해야 합니다. 인덱스는 Lucene의 데이터 구조로서, 검색 속도를 향상시키고 문서의 특정 필드를 빠르게 검색할 수 있도록 합니다. 아래는 예시 코드입니다:

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
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.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class LuceneSearchExample {
    private static final String INDEX_DIRECTORY = "path/to/index/directory";

    public static void main(String[] args) {
        // Indexing code here
        try {
            Analyzer analyzer = new StandardAnalyzer();
            Directory directory = FSDirectory.open(Paths.get(INDEX_DIRECTORY));
            IndexWriterConfig config = new IndexWriterConfig(analyzer);
            IndexWriter indexWriter = new IndexWriter(directory, config);

            // Add documents to the writer

            // Commit and close the writer

            // Searching code here
            IndexSearcher indexSearcher = new IndexSearcher(indexWriter.getReader());

            // Sort by field
            Sort sort = new Sort(new SortField("date_field", SortField.Type.LONG, false));

            // Perform search query with sorting
            TopDocs topDocs = indexSearcher.search(query, null, limit, sort);

            // Process search results

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 코드에서 date_field는 시간 정보를 담고 있는 필드명으로, 이 필드를 기준으로 정렬합니다. 필요에 따라 다른 필드를 선택할 수도 있습니다.

2. 검색 결과 정렬

검색 결과를 시간순으로 정렬하려면 SortField를 사용하여 정렬 방식을 지정해야 합니다. 위의 예시 코드에서는 SortField.Type.LONG을 사용하여 필드의 값을 정수형으로 해석하고, false를 전달하여 내림차순으로 정렬합니다.

다음으로 IndexSearcher.search() 메서드의 sort 매개변수에 정렬 객체를 전달하여 검색 결과를 시간순으로 정렬합니다.

IndexSearcher indexSearcher = new IndexSearcher(indexWriter.getReader());

Sort sort = new Sort(new SortField("date_field", SortField.Type.LONG, false));

TopDocs topDocs = indexSearcher.search(query, null, limit, sort);

위 코드에서 query는 검색어를 담고 있는 Query 객체로, 검색어에 따른 필터링된 결과를 가져옵니다.

정렬된 검색 결과를 사용자에게 제공하거나 하는 방식은 상황에 따라 다를 수 있으므로, 실제 코드에서는 이후의 처리 로직을 추가하여 원하는 결과를 얻을 수 있도록 구현해야 합니다.

참고 문서