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

[经验分享] Solr分词器大补贴:mlcsseg

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-11-1 12:15:51 | 显示全部楼层 |阅读模式
  0. 序言
  经常遇到不少人询问如何在solr4.x中集成各种分词器,其实也算是咱曾经的工作之一:按照solr的接口把一些分词器对接起来。所幸之前一直都接触这方面的内容因而没走什么弯路,值此团队开博之时,正好把一些代码重新整理共享一下。
  1. 设计
  Java系的中文分词挺多了,ik,paoding,mmseg4j,ictclas4j,ansj等等,目前选取实现的是ik和ansj。将分词器扩展到solr易用模式我们考虑了2点:1. 大部分分词器的扩展自定义词库的功能都是读取本地文件,solr在单机环境读取的资源路径是磁盘但在solrcloud模式下读取的资源路径是zookeeper, 因此需要把分词器读取扩展自定义的词库改成以solr资源路径为准的。2. 在solrcloud模式下分词器触发扩展词库操作必须是每个replica都自己去做一遍,自己写solr的requesthandler是不能进行同索引分发的(比如mmseg4j写的触发操作handler), 因此要保证每个replica能同时能进行更新到同样的词库。
  对于这两点,我们采用的方式是1:为分词器添加inputstream的读扩展词接口; 2:定时线程检查配置文件是否需要更新词库(会存在微小的时间范围内的不同replica词库不一致,最终会一致,但为了简单一点,没有采用zookeeper监听的方式,也不可能禁止重载词库的时候禁止solr读写)
  2. 代码
  代码托管在github:https://github.com/mlcsdev/mlcsseg   支持版本 4.3 ~ 4.7的solr
  4个子项目:
  mlcsseg-common: 公用功能,所有分词器都要依赖这个
  mlcsseg-filter       :   可动态变更的停用词、同义词 过滤器
  mlcsseg-ik           :    ik分词器
  mlcsseg-ansj       :    ansj分词器
  其中除了mlcsseg-ansj,都是直接mvn package就出的包就可以使用的。
  mlcsseg-ansj需要用mvn assembly:assembly 方式打包带上两个它自己的jar包,你也可以直接手动从lib中拷出来用。(mlcsseg-ansj 本身至少要3个包,加上common 一共4个)
  3. 使用
  以mlcsseg-ik和mlcsseg-filter为例, 把三个对应jar拷贝到一个目录,并在solrconfig中设置好;
  在schema.xml中增加如下内容
  Xml代码  

  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  说明:
  1. 每个tokenizerFactory以及tokenfilterFactory 的属性中多包含了一个 conf=xxxx.conf 的项,xxxx.conf的内容是一个properties格式的配置:
  Java代码  

  •   lastupdate=11223
  •   files=extDic.txt,extDic1.txt,synonyms.txt,isynonyms.txt
  其中的 lastupdate 是一个数字,只要这次修改比上一次大就会触发更新操作;files是分词器或者过滤器对应读取的词典文件名,编码必须是UTF-8,多个以英文逗号分隔。
  2. xxxx.conf文件需要放在对应索引的config路径,例如单机模式放在[collection]/conf下。cloud模式放在./configs/[collection]/下。 也就是和schema solrconfig放在一起。
  在上面的xml中,ik分词器在index时候配置了useSmart=false, 表示不开启智能切分,但在query时候开启了。 (默认useSmart是false)
  再来看下ansj的配置:
  Xml代码  

  •   
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  配置方式和ik一样,analysisType="1" 表示分词类型,1代表标准切分,不写默认是0。是索引类型切分(也就是可能多分出一点词)
  还有一个:rmPunc="false" 表示不去除标点符号。默认不写是true,表示去掉标点符号。
  4. 一些经验
  1. 我们并没有去修改分词器逻辑(IK调整了点智能分词算法),因此效果如何就不是特别关心的事了。如果要将单字切分出来,就把单字作为扩展字库。
  2. 目前IK扩展词库支持同义词词库格式,但ansj的还不支持同义词词库格式。
  3. 默认zookeeper保存1M大小的文件,cloud模式下如果扩展词库过大,需要切成很多份来使用。
  4. 需要照顾查全率的时候,可以在index时候使用多切,query时候用智能切分,但这种方式必然可能会出现index切分不能完全包含query切分;也可以index,query都使用多切分的方式,但这样同义词就用得不方便了(例如“颜色”“色彩”是同义词,你期望query时的同义扩展,即搜“色彩”时候也能匹配到“颜色”,但多分可能导致“彩”字出现,而索引却没有;如果讲同义扩展放到index这边,那么修改同义词库时候就必须重建一次索引)。
  5. 总结
  ik的效率并不太好,我们希望重新实现一个简单高效的分词器。如果有时间会加入mmseg4j的接口。
  欢迎大家使用,并给我们提出各个方面的意见和建议~
  分享到:
  Solr的facet和grouping在电商商品搜索中的 ...

  •   2014-03-26 19:02
  •   浏览 2390
  •   评论(16)
  •   分类:行业应用
  •   相关推荐
评论
  16 楼 lgnlgn 2015-01-26
  gbwl_cgl 写道
  您好!
  请问一下如果是在cloud模式下,ansj自定义词库的情况下,我的词典文件是直接放在./configs/[collection]/下吗?
  是的
  15 楼 gbwl_cgl 2015-01-15
  您好!
  请问一下如果是在cloud模式下,ansj自定义词库的情况下,我的词典文件是直接放在./configs/[collection]/下吗?
  14 楼 轻轻小丸子 2014-09-26
猫猫

  13 楼 lgnlgn 2014-09-26
  确实应该只需要依赖lucene,你是不是没选对分支,master是4.6 solr4.6是没问题的;
  chenbo19867758 写道
  经测算maven依赖的是lucene4.6.1 不兼容solr4.5.1
  感觉楼主没有测试过就说兼容4.3~4.7!!!
  12 楼 chenbo19867758 2014-09-18
  经测算maven依赖的是lucene4.6.1 不兼容solr4.5.1
  感觉楼主没有测试过就说兼容4.3~4.7!!!
  11 楼 chenbo19867758 2014-09-18
  solr4.5.1 报错
  Java代码  

  •   org.apache.solr.handler.dataimport.SolrWriter -64880 [Thread-18] ERROR org.apache.solr.handler.dataimport.SolrWriter  - Exception while solr commit.
  •   ava.lang.UnsupportedOperationException: this codec can only be used for reading
  •   at org.apache.lucene.codecs.lucene42.Lucene42FieldInfosFormat.getFieldInfosWriter(Lucene42FieldInfosFormat.java:103)
  •   at org.apache.lucene.index.DocFieldProcessor.flush(DocFieldProcessor.java:87)
  •   at org.apache.lucene.index.DocumentsWriterPerThread.flush(DocumentsWriterPerThread.java:465)
  •   at org.apache.lucene.index.DocumentsWriter.doFlush(DocumentsWriter.java:506)
  10 楼 chenbo19867758 2014-09-18
  Java代码  

  •   files是分词器或者过滤器对应读取的词典文件名,编码必须是UTF-8,
  注意这个地方
  9 楼 chenbo19867758 2014-09-17
  solr配置报错4.5.1
  Java代码  

  •   coreUnibib: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Plugin init failure for [schema.xml] fieldType "text_ik": Plugin init failure for [schema.xml] analyzer/tokenizer: Error instantiating class: 'org.wltea.analyzer.lucene.IKTokenizerFactory'. Schema file is /solr/solr_home/coreUnibib/schema.xml
  8 楼 chenbo19867758 2014-09-17
  Java代码  

  •   coreUnibib: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Plugin init failure for [schema.xml] fieldType "text_ik": Plugin init failure for [schema.xml] analyzer/tokenizer: Error instantiating class: 'org.wltea.analyzer.lucene.IKTokenizerFactory'. Schema file is /solr/solr_home/coreUnibib/schema.xml
  7 楼 chenbo19867758 2014-09-17
  建议直接导出jar包。
  6 楼 lgnlgn 2014-08-08
  senhui19 写道
  你好,最近发现solr升级到了4.9,尝试使用了下你写的插件,配置成功后,使用分词时出现了异常情况,不能能否做个升级适配呢?谢谢。
  这事估计没人料理了,只能建议你把依赖改成4.9以后自行修改源码
  5 楼 senhui19 2014-08-01
  你好,最近发现solr升级到了4.9,尝试使用了下你写的插件,配置成功后,使用分词时出现了异常情况,不能能否做个升级适配呢?谢谢。
  4 楼 syncml 2014-06-09
  每个tokenizerFactory以及tokenfilterFactory 的属性中多包含了一个 conf=xxxx.conf 的项,xxxx.conf的内容是一个properties格式的配置:
  conf文件能说得详细一点吗
  3 楼 mlcsdev 2014-05-14
  xinggg22 写道
  没提供maven的repo下载吗?
  没有,你只要打包出来拿jar包来用就行了,暂没提供打包好的
  2 楼 xinggg22 2014-05-14
  没提供maven的repo下载吗?
  1 楼 qindongliang1922 2014-03-28
  猫猫,厉害 哈哈哈哈哈!
  转载:http://mlcsdev.iteye.com/blog/2037109


运维网声明 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-629373-1-1.html 上篇帖子: Solr数据导入之SolrInputDocument导入数据 下篇帖子: solr4.3 solrconfig.xml配置文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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