zoukankan      html  css  js  c++  java
  • Lucene 6.0下使用IK分词器

    Lucene 6.0使用IK分词器需要修改修改IKAnalyzer和IKTokenizer.
    使用时先新建一个MyIKTokenizer类,一个MyIkAnalyzer类:

    MyIKTokenizer.java

    import java.io.IOException;
    import java.io.Reader;
    
    import org.apache.lucene.analysis.Tokenizer;
    import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
    import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
    import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
    import org.wltea.analyzer.core.IKSegmenter;
    import org.wltea.analyzer.core.Lexeme;
    
    public class MyIKTokenizer extends Tokenizer {
        // IK分词器实现
        private IKSegmenter _IKImplement;
    
        // 词元文本属性
        private final CharTermAttribute termAtt;
        // 词元位移属性
        private final OffsetAttribute offsetAtt;
        // 词元分类属性(该属性分类参考org.wltea.analyzer.core.Lexeme中的分类常量)
        private final TypeAttribute typeAtt;
        // 记录最后一个词元的结束位置
        private int endPosition;
    
        public MyIKTokenizer(Reader in) {
            this(in, false);
        }
    
        public MyIKTokenizer(Reader in, boolean useSmart) {
            offsetAtt = addAttribute(OffsetAttribute.class);
            termAtt = addAttribute(CharTermAttribute.class);
            typeAtt = addAttribute(TypeAttribute.class);
            _IKImplement = new IKSegmenter(input, useSmart);
        }
    
        @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;
        }
    
        public void reset() throws IOException {
            super.reset();
            _IKImplement.reset(input);
        }
    
        @Override
        public final void end() {
            // set final offset
            int finalOffset = correctOffset(this.endPosition);
            offsetAtt.setOffset(finalOffset, finalOffset);
        }
    
    }
    

    MyIkAnalyzer.java

    package cn.ucas.lucene.ik;
    
    import java.io.Reader;
    import java.io.StringReader;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.util.IOUtils;
    
    public class MyIkAnalyzer extends Analyzer {
    
        @Override
        protected TokenStreamComponents createComponents(String arg0) {
            Reader reader=null;
            try{
                reader=new StringReader(arg0);
                MyIKTokenizer it = new MyIKTokenizer(reader);
                return new Analyzer.TokenStreamComponents(it);
            }finally {
                IOUtils.closeWhileHandlingException(reader);
            }
        }
    
    }
    

    在Lucene中使用IK分词器:

    Analyzer myIkAnalyzer=new MyIkAnalyzer();
  • 相关阅读:
    [笔记] Duke
    foxmail配置office365邮箱
    bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白
    项目技术沉淀0
    alibaba开发手册
    关于fastjson
    org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: 'xE2x80x8BxE2x80x8B...' for column 'pro_backgroud' at row
    datatable某列不排序、和自定义搜索、给数据里面加属性
    19.10.30笔记-文件下载
    没有图片的freemarker下载,备份
  • 原文地址:https://www.cnblogs.com/hainange/p/6153790.html
Copyright © 2011-2022 走看看