Elasticsearch-IK分词器源码学习01

Elasticsearch-IK分词器源码学习01

  • 一、说明
    • 1、源码参考
    • 2、IDE
    • 3、Demo
  • 二、整体流程
    • 1、构建字典
      • 1.1、DictSegment类基本介绍
      • 1.2、DictSegment类lookforSegment()构建字典
    • 2、分词
      • 2.1、分词入口
      • 2.2、IKSegmenter类
      • 2.3、AnalyzeContext类
        • 2.3.1、fillBuffer()方法读取输入
        • 2.3.2、Lexeme getNextLexeme()方法
      • 2.4、CJKSegmenter类
        • 2.4.1、Hit类
        • 2.4.2、字符类型识别
        • 2.4.3、实际分词整体流程
      • 2.5、IKArbitrator类
            • 1. 路径文本长度和([上海、人民],加起来长度为4)长的优先;
            • 2. 词元个数越少越优先;
            • 3. 路径跨度越大越优先([上海、人民],跨度为下标0-4,长度为4);
            • 4. 路径跨度越靠后的越优先([上海、人民】,跨度最后为下标4),依据:根据统计学结论,逆向切分概率高于正向切分,因此位置越靠后的优先;
            • 5. 词长越平均越好:
            • 6. 词元位置权重比较,越大的越优先;
  • 三、总结

一、说明

本文是简单介绍IK分词器的源码,整体的结构,不涉及详细具体的源码分析,请知晓。

1、源码参考

地址:[email protected]:medcl/elasticsearch-analysis-ik.git
tag为:5.3.2

2、IDE

Intellij idea+Maven 3.0

3、Demo

package iktest;

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.elasticsearch.common.settings.Settings;
import org.junit.Test;
import org.wltea.analyzer.cfg.Configuration;
import org.wltea.analyzer.lucene.IKTokenizer;

import java.io.IOException;
import java.io.StringReader;
import java.util.concurrent.ConcurrentHashMap;

public class IKTestOne {
   

    public final String TEXT_Chinese = "上海迪士尼乐园";

    @Test
    public void test1() throws IOException {
   
        Settings settings = Settings.EMPTY;
        Configuration conf = new Configuration(null, settings);
        //use ik_smart
        conf.setUseSmart(true);
        IKTokenizer tokenizer = new IKTokenizer(conf);
        tokenizer.setReader(

你可能感兴趣的:(es,elasticsearch,lucene)