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

[经验分享] ansj分词器和solr结合的零零碎碎

[复制链接]

尚未签到

发表于 2016-12-16 11:23:34 | 显示全部楼层 |阅读模式
在solr4.8使用的章节里我讲了很多有关ansj分词器的用法以及相关描述和个人看法。这里新开一篇专门描述。

传送门:https://github.com/ansjsun/ansj_seg/
作者是个年轻的技术男,github上有他的微博,可以和他沟通交流问题(加粉吧,虽然微博现在不流行了,但是这么好的分词器的作者才800多粉丝看着心疼)。

ansj最新版下载下来有40+MB,不过新特性自然语言方面用到的crf.model(NlpAnalysis分词会用到)占了37MB,一般做搜索的是用不到的,所以直接精简掉吧,立刻很轻松有木有。去掉之后就不能再用NlpAnalysis分词了,不过因为分词器通常和索引以及搜索混合使用,建议用ToAnalysis即可。

ansj附加词库是比较前卫的树形添加,按照文件或者文件夹批量添加,这样会带来一个问题,词库是在项目内还是另外存放,在项目内的话,打包项目后不方便找到,有时会有bug,这里我是推荐另外存放,也方便持续添加,然后用配置文件来指向目录即可。开发中善用配置文件可以明显得提高生产力,避免将配置写死在代码里。

如果只用一种分词方法来实现索引和搜索,那么重写Tokenizer即可,但是实际使用solr过程中,索引我们通常希望最小颗粒,搜索采用智能分词,所以就需要传入参数进行配置选择特定的分词器,因此需要重写TokenizerFactory,传入参数。我的schema.xml配置如下
<fieldType name="text_ansj" class="solr.TextField" positionIncrementGap="100">  
    <analyzer type="index">  
      <tokenizer class="org.ansj.solr.ANSJTokenizerFactory" useSmart="false"/>  
  <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
    </analyzer>  
<analyzer type="query">  
      <tokenizer class="org.ansj.solr.ANSJTokenizerFactory" useSmart="true"/>  
  <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
    </analyzer>  
  </fieldType>
考虑到ansj自己并没有停用词库,后续应该会添加lucene自己的停用词库。重写Tokenizer时需要注意termAtt和offsetAtt设置不要出错,因为ansj的Term没有末位位置,所以需要自己处理:
termAtt.copyBuffer(term.getName().toCharArray(),0,term.getName().length());
offsetAtt.setOffset(term.getOffe(),term.getOffe()+term.getName().length());


前段时间ansj结合solr4.8后一直在做solrcloud,后来直接拿来用,发来ansj有不少问题和不足。一个很大的bug是它索引排序有问题,导致useFastVectorHighlighter时候会报错,无法使用。这个一个不小的问题。我折腾很久,甚至差点放弃了ansj,最后总算发现是ansj的IndexAnalysis有不够周全的地方。毕竟ansj的分词重点是智能分词和发现新词,传统分词不被作者重视也在情理之中。下面说下问题具体所在。
    比如我们要对“创业者创业”进行分词,传统的IKanalyzer之类的分词,分出来是“创业者 创业 业者 创业”,ansj分词是“创业者 创业 创 创业 业 者”。先不说创业者被过分细碎分词(ansj实在太简单粗暴了),这个分出来的词排序明显不对,position位置错误,useFastVectorHighlighter高亮会存储错误的向量地址。所以需要在IndexAnalysis里矫正分词的排序。

     然后是最细分词的问题,抽时间我会进行二次开发,提高准确度,降低冗余。



未完待续....

运维网声明 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-315149-1-1.html 上篇帖子: Lucene 4 和 Solr 4 学习笔记(3) 下篇帖子: jquery autocomplete实现solr查询字段自动填充并执行查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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