검색엔진

Hagi 2009. 11. 10. 15:36

제 1장 루씬과의 첫 만남 - 1.4.2 색인 내의 검색 (p15) 

 

package restart.hagi.ironwill.lucene.index;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import org.apache.lucene.analysis.kr.KoreanAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.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 {
 private File indexPath;
 private String query;
 
 public Searcher(){
  //index폴더 지정
  this.indexPath = new File("storage/lucene/index");
  if(!this.indexPath.exists()||!this.indexPath.isDirectory()){
   System.out.println("지정한 폴더가 잘못되었습니다.");
  }
  this.setIndexPath(indexPath);
 }
 
 public static void main(String[] args){
  Searcher searcher = new Searcher();
  
  //사용자 지정 쿼리 입력
  Scanner sc = new Scanner(System.in);
  System.out.println("검색어를 입력하세요 : ");
  String userQuery = sc.nextLine();
  searcher.setQuery(userQuery);
  
  //검색하기
  searcher.searcher(searcher.getIndexPath() , searcher.getQuery());
 }
 
 public void searcher(File indexPath, String query){
  Directory fsDir = null; IndexSearcher is = null; QueryParser parser = null;
  try {
   fsDir = FSDirectory.open(indexPath);    //파일로 저장한 Directory를 탐색하기 위해 연다.
   is = new IndexSearcher(fsDir,true); //인덱스를 하여 찾되 읽기 전용으로 한다.
   parser = new QueryParser("contents",new KoreanAnalyzer());  //contets를 검색하기 위한 parser
   Query luceneQuery = parser.parse(query);         //사용자 쿼리를 루씬이 사용할 수 있도록 바꿈
   TopDocs searchResult = is.search(luceneQuery, 100);//루씬쿼리로 100개를 찾는다.
   int resultsNum = searchResult.totalHits; //총 검색 갯수
   System.out.println(resultsNum+"개가 검색되었습니다.");
   
   ScoreDoc[] scores = searchResult.scoreDocs;
   
   for(int i=0;i<scores.length;i++){
    Document doc = is.doc(searchResult.scoreDocs[i].doc);
    System.out.println("파일이름 : "+doc.get("filename"));
   }
  } catch (ParseException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public File getIndexPath() {
  return indexPath;
 }
 public void setIndexPath(File indexPath) {
  this.indexPath = indexPath;
 }
 public String getQuery() {
  return query;
 }
 public void setQuery(String query) {
  this.query = query;
 }
 
}