Lucene - 분석기(Analyzer)로 분석한 토큰(Token)결과 출력
package com.lucene.study;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.CharTermAttributeImpl;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.apache.lucene.util.AttributeImpl;
import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.*;
public class AnalyzerTest {
private static final String[] examples = {"The quick brown fox jumped over the lazy dog","XY&Z Corporation - zyz@example.com","안녕하세요? 피자 주문하려고 하는데요."};
private static final Analyzer[] analyzers = new Analyzer[] {new WhitespaceAnalyzer(),new SimpleAnalyzer(),new StopAnalyzer(),new StandardAnalyzer()};
public static void analyze(String text) throws IOException {
System.out.println("Analyzing \"" +text+ "\"");
System.out.println("\n");
for(Analyzer analyzer : analyzers) {
String name = analyzer.getClass().getSimpleName();
System.out.println(" "+name+" ");
System.out.print(" ");
AnalyzerUtils.displayTokens(analyzer,text);
System.out.println("\n");
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String[] strings = examples;
for(String text:strings) {
analyze(text);
}
}
}
class AnalyzerUtils{
public static void displayTokens(Analyzer analyzer,String text) throws IOException {
displayTokens(analyzer.tokenStream("content", new StringReader(text)));
}
public static void displayTokens(TokenStream stream) throws IOException {
//텀 속성확인
CharTermAttribute cattr = stream.addAttribute(CharTermAttribute.class);
//위치증가값 속성 확인
PositionIncrementAttribute postAtrr = stream.addAttribute(PositionIncrementAttribute.class);
//오프셋위치확인
OffsetAttribute offsetAttr = stream.addAttribute(OffsetAttribute.class);
//텀타입 속성 확인
TypeAttribute typeAttr = stream.addAttribute(TypeAttribute.class);
stream.reset();
int position = 0;
while (stream.incrementToken()) {
int increment = postAtrr.getPositionIncrement();
position = position + increment;
System.out.println();
System.out.print(position + ": ");
System.out.print("[ "+cattr.toString()+" : " + offsetAttr.startOffset()+"->"+offsetAttr.endOffset()+" : "+typeAttr.type()+" ]");
}
stream.end();
stream.close();
}
}
Lucene - 분석기(Analyzer)로 분석한 토큰(Token)결과 출력
루씬에서 색인을 하기위해서는 선행과정이 있다. 물론 문서안에 정의된 여러개의 필드에 적용한 속성에 따라 다르긴 하지만 ANALYZE속성을 적용한 필드인 경우에는 색인하기 이전에 텍스트를 토큰으로 추출하고 그 토큰에 여러가지 메타정보(start,end 정수/위치증가값 등등의 데이터)를 섞은 텀으로 만든 후에 색인에 들어간다. 여기에서 보여줄 예제는 색인을 위한 텍스트에 분석기의 분석과정을 적용 후에 어떻게 토큰이 분리되는지 확인하는 간단한 예제이다.
출처: https://coding-start.tistory.com/75?category=784008 [코딩스타트]
'Big Data > Lucene' 카테고리의 다른 글
Lucene - 인메모리버퍼(In-Memory-Buffer) 역할, 세그먼트 병합(Merge) (0) | 2021.04.19 |
---|---|
Lucene - 유사어,동의어 필터(SynonymFilter)를 이용한 커스텀 Analyzer (0) | 2021.04.19 |
Lucene library를 이용한 간단한 색인/검색(루씬 라이브러리이용) (0) | 2021.04.18 |