Solr 关于Analyzer、Tokenizer、和Filter,以及中文分词器

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

  • ananlyzer:告诉solr在建立索引和搜索的时候,如何处理text类型的内容,比如要不要去掉“a”、去掉介词、去掉复数,要不要全部变成小写等等……它在schema.xml文件中配置,可以直接指定一个类给它;也可以由tokenizer和filter的组合来实现:
    • type:可选参数,index或query,表名这个配置是在建立索引还是在搜索的时候使用
    • tokenizer:分词器,比如:StandardTokenizerFactory
    • filter:过滤器,比如:LowerCaseFilterFactory,小写转换

Analyzer负责把文本field转成token流,然后自己处理、或调用Tokenzier和Filter进一步处理,Tokenizer和Filter是同等级和顺序执行的关系,一个处理完后交给下一个处理。

Tokenizer和Filter的区别
  • Tokenizer:接收text(通过从solr那里获得一个reader来读取文本),拆分成tokens,输出token stream
  • Filter:接收token stream,对每个token进行处理(比如:替换、丢弃、不理),输出token stream
因此,在配置文件中,Tokenizer放在第一位,Filter放在第二位直到最后一位。

一个Tokenizer处理文本的例子:
输入:"Please, email  john.doe@foo.com  by 03-09, re: m37-xq."
输出:"Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"

:配置文件位置:<solr-home>/server/solr/configsets/<collection-name>

对于简单的英文文本,可以这样配置(使用空格分词器,不需要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>

简体中文分词:
Solr官方提供了简体中文分词器SmartCn。关于如何配置,可以这个文件:solr/co  ntrib/analysis-extras/README.txt
官方的配置例子:
<analyzer class="org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer"/>
或:
<analyzer>
    <tokenizer class="solr.HMMChineseTokenizerFactory"/>
    <filter class="solr.StopFilterFactory   words="org/apache/lucene/analysis/cn/smart/stopwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/>
</analyzer>

具体的中文分词器SmartCn配置例子:
拷贝文件lucene-analyzers-smartcn-5.x.x.jar 到 solr/server/solr-webapp/webapp/WEB-INF/lib中
配置文件添加:
<field name="content" type="text_smartcn" indexed="true" stored="true" multiValued="true"/>
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="100"> 
  <analyzer type="index">
    <tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
    <filter class="solr.SmartChineseWordTokenFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
    <filter class="solr.SmartChineseWordTokenFilterFactory"/>
   </analyzer>
</fieldType>

效果测试:
  1. 管理界面(http://<ip>:8983/solr/) -> Core Selector -> Analysis
  2. 选择一个FieldType
  3. 在Field Value (Index) 或 Field Value (Query) 中输入文本
  4. Analyse Values
注:在结果中,把鼠标移到左边的Tokenizer、Filer缩写上面,可以看到全称

相关名词:
  • token:标记、记号,solr中被用来索引或搜索的最小元素,比如英文单词的原形、中文的词语。tokenize:分词,tokenizer:分词器。
  • stem:词干,EnglishPorterFilterFactory负责把单词还原成词干,比如:hugs, hugging, hugged -> hug。

(原创文章,转载请注明转自Clement-Xu的csdn博客。)



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值