Skip to content

Apache Lucene #
Find similar titles

Structured data

Category
Programming

정보 검색 #

정보 검색이란, 집합적인 정보로부터 원하는 내용과 관련이 있는 부분을 얻어 내는 행위를 말한다. 이를 위해 메타데이터나 색인이 사용될 수 있다. 일반적으로 데이터집합, 색인, 랭킹, 표현, 사용자 피드백이라는 다섯 가지 요소로 구성되어 있다.

Apache Lucene #

아파치 루씬이란, 더그 커팅에 의해 개발된 전문검색(full text)을 쉽게 구현할 수 있게 해주는 자바 라이브러리이다. 아파치 소프트웨어 재단에 의해 지원되며, 아파치 라이선스 하에 배포된다. 키워드분석, 색인 등 검색 어플리케이션을 쉽게 만들 수 있도록 많은 클래스들을 제공한다. 루씬을 이용하여 검색하는 과정은 크게 색인과정과 검색과정으로 나눠진다. 색인과정은 문서를 수집하고 텍스트를 분석하여 색인을 만드는 과정이 포함되고, 검색과정은 질의를 받아서 분석하고 이를 이용하여 색인에서 문서를 찾는 과정이 포함된다.

IndexWriter #

IndexWriter 는 루씬에서 제공하는 색인을 생성하는 클래스이다. IndexWriterConfig 를 이용하여 IndexWriter 를 설정하고, 데이터를 Document 객체로 불러와서 IndexWriter 의 파라메터로 사용하여 실제 색인을 생성한다.

// 인덱스를 저장할 디렉터리
Directory dir = FSDirectory.open(new File(indexPath));
// 문서 내용을 분석하기 위한 분석기
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
// IndexWriter 설정 객체 생성
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);

// Document 생성
Document doc = new Document();
doc.add(new Field("contents", new FileReader(f)));
doc.add(new Field("filename", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("fullpath", f.getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED));

// IndexWriter 를 이용하여 Document 를 색인화
IndexWriter writer = new IndexWriter(dir, iwc);
writer.addDocument(doc);
writer.close();

IndexSearcher #

IndexSearcher 는 IndexWriter 로 생성한 색인에서 Document 를 검색하는 클래스이다. 인덱스 디렉터리를 이용하여 IndexSearcher 를 생성하고, 질의어를 Query 객체로 만들기 위해 QueryParser 를 생성한다.

// IndexSearcher 생성
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(indexPath)));

// QueryParser 생성 및 질의어 파싱
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
QueryParser parser = new QueryParser(Version.LUCENE_31, field, analyzer);
Query query = parser.parse(queryString);

// 한 페이지에 보여 줄 검색 결과 수
int hitsPerPage = 10;
// 최상위 검색 결과들
TopDocs results = searcher.search(query, hitsPerPage);
ScoreDoc[] hits = results.scoreDocs;
// 검색된 총 개수
int numTotalHits = results.totalHits;
// 검색결과를 화면에 표현하기
for (int i = 0; i < numTotalHits; i++) {
    Document doc = searcher.doc(hits[i].doc);
    String path = doc.get("path");
    if (path != null) {
        String title = doc.get("title");
        if (title != null) {
            System.out.println(" Title: " + doc.get("title")); 
        }
    } else {
        System.out.println((i+1) + ". " + "No path for this document"); 
    }
}
searcher.close();

참고 #

0.0.1_20210630_7_v33