一、分词器原理
最主要的分词器有SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer。
先来研究一下SimpleAnalyzer。当一串数据传进来之后,会被转化成TokenStream这样一个东西,这个TokenStream中就保存着所有的分词信息。TokenStream是一个抽象类,它有两个实现类,分别是Tokenizer和TokenFilter。其中Tokenizer将一组数据划分成一个一个的语汇单元,TokenFilter将这些语汇单元进行过滤并处理,将通常是一组TokenFilter来完成这个操作,因为有的Filter是过滤停用词的,有的是需要将首字母转换成小写的,有的是将词语转换成原型的,等等。最后将数据传递给TokenStream。
二、示例详解
假设我们需要分词的是“how are you, thank you”这么一个字符串。首先这个字符串会被拆成“how”、“are”、“you”、“thank”、“you”这5个语汇单元,这5个语汇单元需要保存信息和位置,于是CharAttributeTerm保存了相应的语汇单元,OffsetTerm保存了各个词汇之间的偏移量,PositionIncrTerm保存了词于词之间的位置增量,默认为1,如果3个词中,第2个词是停用词,那么第1个和第3个词之间的位置增量就不是1了。其实Lucene查找这次词语是根据位置来查找的,如果同一个位置有两个词语,那么查找的时候都会查找出来,这是同义词的概念,现在描述不清楚,后面再详细介绍。