在学习自定义分词前,都需要了解分词的流程,以及如何显示分词的信息。
主要的几大分词器
1.StandardAnalyzer 标准分词器
2.SimpleAnalyzer 简单分词器
3.StopAnalyzer 停止分词器
4.WhiterSpaceAnalyzer 空格分词器

分词原理

分词流程

Lucene之显示分词信息-yellowcong_分词器

TokenFilter进行过滤操作,获取有用的信息
Lucene之显示分词信息-yellowcong_其他_02

Tokenizer可以将Reader读取进来的文字流转化为一个一个的短语单元
Lucene之显示分词信息-yellowcong_lucene_03

分词信息

Lucene之显示分词信息-yellowcong_分词器_04

AnalyzerUtils

package com.yellowcong.demo;

import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;

public class AnalyzerUtils {

    private AnalyzerUtils(){}

    public static void displayToken(String str,Analyzer a) throws IOException{
        //获取分词的流 ,其中content 是 流的名称,可以随便写
        TokenStream stream = a.tokenStream("", new StringReader(str));
        //创建一个属性,将这个属性添加到流中
        CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);

        //重置TokenStream 到流的开始
        //没有这句报错
        stream.reset();
        while(stream.incrementToken()){
            System.out.print("["+cta.toString()+"]");
        }
        System.out.println();
    }

    //产看所有的属性信息
    public static void displayAllTokeInfo(String str,Analyzer a) throws IOException{
        //获取流
        TokenStream stream = a.tokenStream("content", new StringReader(str));
        //添加位子信息   存储语汇单元的位置距离
        PositionIncrementAttribute ps = stream.addAttribute(PositionIncrementAttribute.class);
        //添加分词信息  存储语汇单元位子的偏移量
        OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
        //添加字符信息 存储语汇单元信息
        CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
        //添加类型信息  获取分词器的类型
        TypeAttribute ta = stream.addAttribute(TypeAttribute.class);

        //将流重置为开始位置
        stream.reset();
        while(stream.incrementToken()){
            System.out.println(cta.toString()+"位置信息"+ps.getPositionIncrement()+"\t"+
                                "分词信息:["+oa.startOffset()+"--"+oa.endOffset()+"]\t"+
                                "类型信息"+ta.type());
        }
        System.out.println();
    }
}

测试

package com.yellowcong.demo;

import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;

/**
 * 创建用户:狂飙的yellowcong<br/>
 * 创建日期:2017年12月3日<br/>
 * 创建时间:下午4:30:07<br/>
 * 机能概要:
 */
public class Demo8 {

    public static void main(String[] args) throws Exception {
        StandardAnalyzer an = new StandardAnalyzer(Version.LUCENE_45);
        String text = "doubi 哈哈";
        AnalyzerUtils.displayToken(text, an);

        AnalyzerUtils.displayAllTokeInfo(text, an);
    }
}

显示结果
Lucene之显示分词信息-yellowcong_apache_05

测试2

package junit.test;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;
import org.junit.Test;

import com.yellowcong.utils.AnalyzerUtils;

public class TestAnalyze {

    @Test
    public void test01() throws IOException{
        //标准分词器
        Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35); //标准分词器  
        Analyzer a2 = new StopAnalyzer(Version.LUCENE_35); //停用分词器
        Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);//简单分词器
        Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);//空格分词器
        String str = "I love you the litter girl";

        AnalyzerUtils.displayToken(str, a1);
        AnalyzerUtils.displayToken(str, a2);
        AnalyzerUtils.displayToken(str, a3);
        AnalyzerUtils.displayToken(str, a4);
    }


    @Test
    public void test02() throws IOException{
        //标准分词器
        Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35); //标准分词器
        Analyzer a2 = new StopAnalyzer(Version.LUCENE_35); //停用分词器
        Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);//简单分词器
        Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);//空格分词器
        String str = "我是逗逼,你不懂"; //其中中文不适用,只有标准的分割的词

        AnalyzerUtils.displayToken(str, a1);
        AnalyzerUtils.displayToken(str, a2);
        AnalyzerUtils.displayToken(str, a3);
        AnalyzerUtils.displayToken(str, a4);
    }

    @Test
    public void test03() throws IOException{
        //标准分词器
        Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35); //标准分词器
        Analyzer a2 = new StopAnalyzer(Version.LUCENE_35); //停用分词器
        Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);//简单分词器
        Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);//空格分词器
        String str = "I love you the litter girl"; //其中中文不适用,只有标准的分割的词

        AnalyzerUtils.displayAllTokeInfo(str, a1);
        AnalyzerUtils.displayAllTokeInfo(str, a2);
        AnalyzerUtils.displayAllTokeInfo(str, a3);
        AnalyzerUtils.displayAllTokeInfo(str, a4);
    }
}

TokenStream.reset

这个重置,以前没有,现在需要设定,如果不设定,就会报错。

//将流重置为开始位置
stream.reset();

报错信息

Exception in thread "main" java.lang.NullPointerException
    at org.apache.lucene.analysis.standard.StandardTokenizerImpl.zzRefill(StandardTokenizerImpl.java:921)
    at org.apache.lucene.analysis.standard.StandardTokenizerImpl.getNextToken(StandardTokenizerImpl.java:1128)
    at org.apache.lucene.analysis.standard.StandardTokenizer.incrementToken(StandardTokenizer.java:173)
    at org.apache.lucene.analysis.standard.StandardFilter.incrementToken(StandardFilter.java:49)
    at org.apache.lucene.analysis.core.LowerCaseFilter.incrementToken(LowerCaseFilter.java:54)
    at org.apache.lucene.analysis.util.FilteringTokenFilter.incrementToken(FilteringTokenFilter.java:82)
    at com.yellowcong.demo.AnalyzerUtils.displayToken(AnalyzerUtils.java:25)
    at com.yellowcong.demo.Demo8.main(Demo8.java:19)

Lucene之显示分词信息-yellowcong_lucene_06