Tag Archives: analyzer

Solr的Analyzer分析

在使用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