词汇单元流
lucene的分词过程,是从Reader中获取原始字符流,产生语汇单元流TokenStream的过程。当分析器获取tokenStream对象以后,它就开始用一个tokenizer对象创建初始语汇单元序列,然后再链接任意数量的tokenFilter对象来修改原始语汇单元。整个分析过程称为分析器链(analyzer chain)。如下图具有2个tokenFilter的分析器链:
TokenStream
分词后产生语汇单元流,流中存储了分词的各种信息,可通过TokenStream有效获取分词单元。
Tokenizer
负责接收Reader对象的字符,创建原始语汇单元——分词。
TokenFilter
负责处理输入的语汇单元,通过新增、删除或修改属性的方式产生新的语汇单元。
词汇单元基本术语
语汇单元
分词过程中产生的基本单元,携带文本值(单词本身)和一些元数据:文本值偏移量、位置增量、词汇单元类型。语汇单元可以选择性包含一些由程序定义的标志位和任意字节数的有效负载,这样程序就能根据具体需要来处理这些词汇单元。
偏移量
偏移量包括起点偏移量和终点偏移量;起点偏移量指词汇单元文本起始字符在原始文本中的位置,终点偏移量指词汇单元文本终止字符的下一个位置。
位置增量
位置增量将当前词汇单元和前一个词汇单元在位置上关联起来。位置增量会影响短语查询和跨度查询,这些查询都需要用到位置信息。
- posIncr = 1, 表示当前词汇单元和前一词汇单元连续,如果所有词汇单元的posIncr都是1,则流中各个文本值存在于唯一确定且连续的位置上。
- posIncr > 1, 表示当前词汇单元和前一词汇单元之间有空隙,可能是移除停用词后产生
- posIncr = 0, 表示当前词汇单元和前一词汇单元处在相同的位置上。词汇单元在同一位置可用于表示某种关系,例如同义词关系。
词汇单元类型
用String对象表示词汇单元类型,默认值是“word”,如果需要可以在词汇单元过滤过程中控制和利用类型属性。
有效负载
每个词汇单元可以有多个选择标志;lucene内置分词器不会使用这些标志,但你自己设计的程序可以使用它们。此外,每个词汇单元都能以byte[]数组形式记录在索引中,用以指向有效负载。
下面是使用StandardAnalyzer分词的一个具体例子,原始文本内容为text:
text = "Bad times make a good man"
分词结果如下图:
位置增量部分,make和good之间的位置增量是2,是因为原句子中的"a"被作为停用词删除掉了。
参考
Lucene实战(第2版)