lucence源码学习

 

=======IKAnalyzer ============

 

/**

* 重载Analyzer接口,构造分词组件

*/

@Override

protected TokenStreamComponents createComponents(String fieldName, final Reader in) {

Tokenizer _IKTokenizer = new IKTokenizer(in , this.useSmart());

return new TokenStreamComponents(_IKTokenizer);

}

 

 

=======IKTokenizer==============

/* (non-Javadoc)

* @see org.apache.lucene.analysis.TokenStream#incrementToken()

*/

@Override

public boolean incrementToken() throws IOException {

//清除所有的词元属性

clearAttributes();

Lexeme nextLexeme = _IKImplement.next();

if(nextLexeme != null){

//将Lexeme转成Attributes

//设置词元文本

termAtt.append(nextLexeme.getLexemeText());

//设置词元长度

termAtt.setLength(nextLexeme.getLength());

//设置词元位移

offsetAtt.setOffset(nextLexeme.getBeginPosition(), nextLexeme.getEndPosition());

//记录分词的最后位置

endPosition = nextLexeme.getEndPosition();

//记录词元分类

typeAtt.setType(nextLexeme.getLexemeTypeString());

//返会true告知还有下个词元

return true;

}

//返会false告知词元输出完毕

return false;

}

=======IKSegmenter==============

/**

* 分词,获取下一个词元

* @return Lexeme 词元对象

* @throws IOException

*/

public synchronized Lexeme next()throws IOException{

Lexeme l = null;

while((l = context.getNextLexeme()) == null ){

/*

* 从reader中读取数据,填充buffer

* 如果reader是分次读入buffer的,那么buffer要  进行移位处理

* 移位处理上次读入的但未处理的数据

*/

int available = context.fillBuffer(this.input);

if(available <= 0){

//reader已经读完

context.reset();

return null;

 

}else{

//初始化指针

context.initCursor();

do{

        //遍历子分词器

        for(ISegmenter segmenter : segmenters){

        segmenter.analyze(context);

        }

        //字符缓冲区接近读完,需要读入新的字符

        if(context.needRefillBuffer()){

        break;

        }

   //向前移动指针

}while(context.moveCursor());

//重置子分词器,为下轮循环进行初始化

for(ISegmenter segmenter : segmenters){

segmenter.reset();

}

}

//对分词进行歧义处理

this.arbitrator.process(context, this.cfg.useSmart());

//将分词结果输出到结果集,并处理未切分的单个CJK字符

context.outputToResult();

//记录本次分词的缓冲区位移

context.markBufferOffset();

}

return l;

}

 

 

=====================CJKSegmenter===================

中文分词

你可能感兴趣的:(ik 源码)