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