设为首页 收藏本站
查看: 1782|回复: 0

[经验分享] Solr 关于Analyzer、Tokenizer、和Filter,以及中文分词器

[复制链接]

尚未签到

发表于 2015-11-12 10:39:37 | 显示全部楼层 |阅读模式
对于文本数据(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>
对于简单的英文文本,可以这样配置(使用空&#26684;分词器,不需要tokenizer和filter):<fieldType name=&quot;nametext&quot; class=&quot;solr.TextField&quot;>    <analyzer class=&quot;org.apache.lucene.analysis.WhitespaceAnalyzer&quot;/></fieldType>
一般情况下,需要更多的处理,比如:<fieldType name=&quot;nametext&quot; class=&quot;solr.TextField&quot;>    <analyzer type=&quot;index&quot;>        <tokenizer class=&quot;solr.StandardTokenizerFactory&quot;/>        <filter class=&quot;solr.StandardFilterFactory&quot;/>        <filter class=&quot;solr.LowerCaseFilterFactory&quot;/>        <filter class=&quot;solr.StopFilterFactory&quot;/>        <filter class=&quot;solr.EnglishPorterFilterFactory&quot;/>    </analyzer></fieldType>注:type=&quot;index&quot;或&quot;type=&quot;query&quot; 这个参数如果没有,则表示两种都适用。注:那些Factory并不是真正的tokenizer或filter,而是负责创建一个实现tokenizer接口的类。注:由于filters是顺序执行的,前一个的结果是后一个是输入,所以,一般通用的处理放在前面,特殊的处理靠后
这些tokenizer和filter是顺序执行的,在建索引的情况下,最后一个filter EnglishPorterFilterFactory的输出,就会被用来建立索引。而原文本是不会变的,比如A Red Cow的索引是red, cow,但原文件还是保持Many Cows。
tokenizer和filter的配置还可以接收额外的参数:<fieldType name=&quot;semicolonDelimited&quot; class=&quot;solr.TextField&quot;>    <analyzer type=&quot;query&quot;>        <tokenizer class=&quot;solr.PatternTokenizerFactory&quot; pattern=&quot;; &quot;/>        <filter class=&quot;solr.LengthFilterFactory&quot; min=&quot;2&quot; max=&quot;7&quot;/>    <analyzer></fieldType>
简体中文分词:Solr官方提供了简体中文分词器SmartCn。关于如何配置,可以这个文件:solr/co ntrib/analysis-extras/README.txt官方的配置例子:<analyzer class=&quot;org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer&quot;/>或:<analyzer>    <tokenizer class=&quot;solr.HMMChineseTokenizerFactory&quot;/>    <filter class=&quot;solr.StopFilterFactory  words=&quot;org/apache/lucene/analysis/cn/smart/stopwords.txt&quot;/>     <filter class=&quot;solr.PorterStemFilterFactory&quot;/></analyzer>
具体的中文分词器SmartCn配置例子:拷贝文件lucene-analyzers-smartcn-5.x.x.jar 到 solr/server/solr-webapp/webapp/WEB-INF/lib中配置文件添加:<field name=&quot;content&quot; type=&quot;text_smartcn&quot; indexed=&quot;true&quot; stored=&quot;true&quot; multiValued=&quot;true&quot;/><fieldType name=&quot;text_smartcn&quot; class=&quot;solr.TextField&quot; positionIncrementGap=&quot;100&quot;>   <analyzer type=&quot;index&quot;>    <tokenizer class=&quot;solr.SmartChineseSentenceTokenizerFactory&quot;/>    <filter class=&quot;solr.SmartChineseWordTokenFilterFactory&quot;/>  </analyzer>  <analyzer type=&quot;query&quot;>    <tokenizer class=&quot;solr.SmartChineseSentenceTokenizerFactory&quot;/>    <filter class=&quot;solr.SmartChineseWordTokenFilterFactory&quot;/>   </analyzer></fieldType>
效果测试:

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

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

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



         版权声明:本文为原创文章,转载请注明转自Clement-Xu的csdn博客。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138243-1-1.html 上篇帖子: solr Repeater(中转器) 下篇帖子: Solr 如何处理日期类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表