Lucene (v4.5) 深入学习 (九) —— 分析器
2 ReuseStrategy
考虑到很可能会扩展自己的分词器,再加上这东西是索引过程的一部分,所以就在这里简单分析一下Lucene的分析器。
1 TokenStream
public final TokenStream tokenStream(final String fieldName, final String text) throws IOException { TokenStreamComponents components = reuseStrategy.getReusableComponents(this, fieldName); @SuppressWarnings("resource") final ReusableStringReader strReader = (components == null || components.reusableStringReader == null) ? new ReusableStringReader() : components.reusableStringReader; strReader.setValue(text); final Reader r = initReader(fieldName, strReader); if (components == null) { components = createComponents(fieldName, r); reuseStrategy.setReusableComponents(this, fieldName, components); } else { components.setReader(r); } components.reusableStringReader = strReader; return components.getTokenStream(); }2 ReuseStrategy
在获得TokenStream中有ReuseStrategy的设置。ReuseStrategy用来确定TokenStreamComponents的重用策略。在Analyzer中有两个默认的ReuseStrategy,分别是GLOBAL_REUSE_STRATEGY和PER_FIELD_REUSE_STRATEGY。GLOBAL_REUSE_STRATEGY对所有的域使用同样的TokenStreamComponents,而PER_FIELD_REUSE_STRATEGY对每个域使用不同的TokenStreamComponents。对于PER_FIELD_REUSE_STRATEGY,需要一个Map使fieldName和特定的TokenStreamComponents对应起来。
3 TokenStreamComponents
TokenStreamComponents包含了需要的Tokenizer。可以通过createComponents方法使用需要的类的对象。后面的Tokenizer chain也是通过这个方法构建。
4 Tokenizer chain
就是将输入的字符串处理成Token的一条链。使用设计模式中的Decorator模式,一系列的类继承了相同的接口incrementToken,通过层层嵌套完成复杂的功能。下面的代码演示了StandardAnalyzer中是如何建立这条处理链的。
4 Tokenizer chain
就是将输入的字符串处理成Token的一条链。使用设计模式中的Decorator模式,一系列的类继承了相同的接口incrementToken,通过层层嵌套完成复杂的功能。下面的代码演示了StandardAnalyzer中是如何建立这条处理链的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) { final StandardTokenizer src = new StandardTokenizer(matchVersion, reader); src.setMaxTokenLength(maxTokenLength); TokenStream tok = new StandardFilter(matchVersion, src); tok = new LowerCaseFilter(matchVersion, tok); tok = new StopFilter(matchVersion, tok, stopwords); return new TokenStreamComponents(src, tok) { @Override protected void setReader(final Reader reader) throws IOException { src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength); super.setReader(reader); } }; } |
如果需要生成自己的Tokenizer链,也使用类似的方法。
在http://blog.csdn.net/liweisnake/article/details/12568209中,列出了其他的一些由Lucene提供的Tokenizer和TokenFilter。
在http://blog.csdn.net/liweisnake/article/details/12568209中,列出了其他的一些由Lucene提供的Tokenizer和TokenFilter。
5 AttributeSource
TokenStream继承自AttributeSource,而Tokenizer和TokenFilter继承自TokenStream。AttributeSource包括了两个重要的成员变量,即:attributes和attributeImpls。Attributes是接口,而attributeImpls是接口的实现。它们记录并处理Tokenize过程中的底层数据。
下图是一些tokenattributes:

Please read full article from Lucene (v4.5) 深入学习 (九) —— 分析器下图是一些tokenattributes:
No comments:
Post a Comment