在使用Solr时,schema.xml中定义FieldType时可以指定其Analyzer。这个Analyzer在index和query时对该feild存储的值进行处理,生成token stream。这个Analyzer的基本结构如下:
<fieldType>
<analyzer>
<charFilter/>
<tokenizer/>
<filter>
</analyzer>
</fieldType>
Analyzer 的输入是字符串,即field中存储的值,输出是token stream.
Analyzer可以是单独的一个类,如org.apache.lucene.analysis.WhitespaceAnalyzer,也可以是由一系统其它组件组成的chain,如:
<fieldType name="nametext" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"/>
</analyzer>
</fieldType>
fieldType中的Analyzer在index和query两个阶段都会做处理,因此index和query两个阶段的analyzer可以不相同。如果没有指定analyzer的type,则表明index与query阶段用的是同样的analyzer。如:
<fieldType name="nametext" class="solr.TextField">
<analyzer *type="index"{*}>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
</analyzer>
<analyzer *type="query"{*}>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
下面看一看组成analyzer的组件,其中一个analyzer chain中必须且只能包含一个tokenizer。tokenizer的作用是将输入的text stream 分解若干token。而filter的输入是token流,产出也是token流,因此多个filter可以组成一个filter chain。filter主要针对输入的token流进行处理,如做stem,去除stopwords等。solr本身已经提供了大量的tokenizer和filter,同时这种机制也让我们可以方便的进行定制。
除了tokenizer和filter之外,Solr还提供了一种CharFilterFactories,这个CharFilterFactories可以配置到analyer链中,但是必须配置在tokenizer之前。CharFilterFactories可以对于输入到tokenizer中的文本流做一些预处理。
solr中默认包含的analyzer,tokenizer,filter,可以到下面网址查看:
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters