和切词器一样,过滤器也是消费输入,然后输出一串的 tokens,过滤器也是继承自 org.apache.lucene.analysis.TokenStream。和切词器不一样的是,一个过滤器的输入是另一种TokenStream。通常情况下,过滤器的工作比切词器简单,过滤器拿着每个token,决定是继续流转下去或者替换或者抛弃。
过滤器消费一个 TokenStream 然后产生一个新的 TokenStream,过滤器可以一个接一个组成一个链。链上的每个过滤器按顺序执行,因此注明过滤器的顺序显得很重要。通常情况下,先执行普通过滤器,然后执行专业过滤器。[xml]
<fieldType name="text" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"/>
</analyzer>
</fieldType>[/xml]
这个例子以solr标准分词器为开始,这个分词器会将字段的文本拆分成tokens,这些tokens再通过solr标准过滤器,标准过滤器移除字母中的点号,并且执行一些其他通用的操作。然后所有的token被转成小写,这样查询时可以匹配大小写不敏感搜索。
上面例子中最后一个过滤器是一个 stemmer 过滤器,它使用了Porter算法。