본문 바로가기

Lucene

[lucene] 색인과 검색

이번 루씬 프로젝트를 시작하면서..



색인 :

// indexWriter를 생성한다. 경로와 분석기를 넘겨줌

IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(), true);
// 복합파일이냐 멀티파일이냐.. (추후설명)

writer.setUseCompoundFile(false);

// 색인에 추가될 Document 생성

Document doc = new Document();

//Document에 필드 추가
doc.add(Field.Text("contents", new FileReader(f)));
doc.add(Field.Keyword("filename", f.getCanonicalPath()));

//색인에 Document 추가
writer.addDocument(doc);


Field는 컬럼 /  Document는 Row로 생각해도 비슷하겠음..

루씬 1.4.X는

doc.add(Field.Text("contents", new FileReader(f)));

이렇게 사용하지만

루씬 2.X 부터는

org.apache.lucene.document.Field.Field(String name, String value, Store store, Index index)

를 사용한다.


예>

Field field = new Field(id, content, Field.Store.YES ,Field.Index.TOKENIZED );

doc.add(field);

writer.addDocument(doc_lucene);



검색 :

//FSDirectory 생성

Directory fsDir = FSDirectory.getDirectory(indexDir, false);

//IndexSearcher 생성

IndexSearcher is = new IndexSearcher(fsDir);

/* query 객체를 생성한다.

Query org.apache.lucene.queryParser.QueryParser.parse(String query, String field, Analyzer analyzer) throws ParseException

들어온 쿼리가 넘겨진 분석기에 의해 분석된다.

*/

Query query = QueryParser.parse(q, "contents", new StandardAnalyzer());


//검색한다.

//결과에 본문은 들어가지 않는다. 결과에 포함된 문서ID의 목록만을 가져옴

Hits hits = is.search(query);


for (int i = 0; i < hits.length(); i++) {
      Document doc = hits.doc(i);
      System.out.println(doc.get("filename")); //filename이라는 필드명으로 필드가 들어가있어야함
}

색인 주요 클래스

IndexWriter

색인을 총괄. 색인에 문서추가 및 새로운 색인 생성.

Directory

색인을 저장할 저장소. 이 클래스를 상속한 RAMDirectory와 FSDirectory가 있음.

RAMDirectory에 색인을 올리면 속도는 빠른데 껐다켜면 색인이 다 날아간당..

Analyzer

텍스트 분석기.

검색 질의어나 내용을 토큰으로 분리한다. 이 Analyzer가 매우 중요함. (일종의 형태소 분석기)

Document

색인에 추가되는 데이터의 단위.

Field

색인에 추가되는 내용은 Document 인스턴스에 Field 형태로 추가 되어야 함

Field.Store.YES // 인덱스를 할 값 모두를 인덱스에 저장. 검색결과에서 보여야 되는 내용일때 사용

Field.Store.NO // 값을 저장하지 않음. 검색은 되데,원본글이 필요없을 경우 사용

Field.Store.COMPRESS  // 값을 압축하여 저장. 저장할 글의 내용이 크거나,2진 바이너리 파일등에 사용


Field.Index.TOKENIZED // Analyzer에 의한 토크나이즈를 수행하여 인덱싱. 검색 가능.

Field.Index.UN_TOKENIZED // 토크나이즈를 수행하지 않는다. 숫자라거나, 쪼갤필요가 없는 문자열에 사용. 물론 검색 됨

Field.Index.NO // 인덱싱을 하지 않음. 검색은 하지 않지만 '상품코드' 같이 필요한 데이타 일 경우 Store.YES와 함께 사용

Field.Index.NO_NORMS // 인덱싱 시간이 빨라야 할때 사용. Analyze를 수행하지 않음. 필드 Length 노멀라이즈를 수행하지 않음


핵심 검색 클래스

IndexSearcher

색인 디렉토리에 연결 검색을 담당

Term

색인의 내부에서 단어를 의미하는 가장 기본적인 요소

Analyzer가 분석해준 토큰을 이용해 IndexWriter가 텀을 만들어냄

Query q = new TermQuery(new Term("contents","lucene"));

Hits hits = is.search(q);

Query

루씬에서 검색어를 지정 할 때 사용

TermQuery

루씬이 지원하는 Query의 하위 클래스 중 다른 모든 것들의 기본인 클래스

Hits

결과 문서에 대한 ID 목록을 갖는 클래스..