solr5.5教程-Analyzer、Tokenizer、Filter

时间:2022-04-27 07:14:02

对于文本,solr在建立索引和搜索的时候需要对其做一定的处理(比如英文要去掉介词、转成小写、单词原形化等,中文要恰当地要分词)。这些工作,一般由Analyzers、Tokenizers、和Filter来实现。这三个东东配置在fieldType中。下面分别介绍一下

1、analyzer:告诉solr在建立索引和搜索的时候,如何处理text类型的内容,比如要不要去掉“a”、去掉介词、去掉复数,要不要全部变成小写等等……它在schema.xml文件中配置,可以直接指定一个类给它;也可以由tokenizer和filter的组合来实现。

此结点有几个参数:

  • type:可选参数,index或query,表名这个配置是在建立索引还是在搜索的时候使用
  • tokenizer:分词器,比如:StandardTokenizerFactory
  • filter:过滤器,比如:LowerCaseFilterFactory,小写转换

2、tokenizer:在analyzer结点内,指定analyzer的分词器。

3、filter:过滤器,比如:LowerCaseFilterFactory,小写转换

下面是一个配置的例子:

<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
</analyzer>
<analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
Tokenizer和Filter的区别
  • Tokenizer:接收text(通过从solr那里获得一个reader来读取文本),拆分成tokens,输出token stream
  • Filter:接收token stream,对每个token进行处理(比如:替换、丢弃、不理),输出token stream
因此,在配置文件中,Tokenizer放在第一位,Filter放在第二位直到最后一位。
 
 
对于简单的英文文本,可以这样配置(使用空格分词器,不需要tokenizer和filter):
<fieldType name="nametext" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
</fieldType>
一般情况下,需要更多的处理,比如:
<fieldType name="nametext" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"/>
</analyzer>
</fieldType>
注:type="index"或"type="query" 这个参数如果没有,则表示两种都适用。
注:那些Factory并不是真正的tokenizer或filter,而是负责创建一个实现tokenizer接口的类。
注:由于filters是顺序执行的,前一个的结果是后一个是输入,所以,一般通用的处理放在前面,特殊的处理靠后
 
这些tokenizer和filter是顺序执行的,在建索引的情况下,最后一个filter EnglishPorterFilterFactory的输出,就会被用来建立索引。而原文本是不会变的,比如A Red Cow的索引是red, cow,但原文件还是保持Many Cows。
 
tokenizer和filter的配置还可以接收额外的参数:
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="; "/>
<filter class="solr.LengthFilterFactory" min="2" max="7"/>
<analyzer>
</fieldType>