`
mlcsdev
  • 浏览: 15444 次
  • 来自: 南宁
社区版块
存档分类
最新评论

Solr分词器大补贴:mlcsseg

阅读更多

 

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中增加如下内容

 

   <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
         <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
          <filter class="solr.LowerCaseFilterFactory"/>
           <filter class="org.apache.solr.analysis.DStopFilterFactory" ignoreCase="true" enablePositionIncrements="true" conf="stop.conf"/>
           <filter class="org.apache.solr.analysis.DSynonymFilterFactory" ignoreCase="true" expand="true" conf="synonym.conf"/>
      </analyzer>
   </fieldType>
        说明:

 

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

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的配置:

 

 <fieldType name="text_ansj" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
       <tokenizer class="org.ansj.solr.AnsjTokenizerFactory" conf="ansj.conf"/>
     </analyzer>
	 <analyzer type="query">
       <tokenizer class="org.ansj.solr.AnsjTokenizerFactory" analysisType="1"/>
     </analyzer>
   </fieldType>

 配置方式和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的接口。

欢迎大家使用,并给我们提出各个方面的意见和建议~

分享到:
评论
17 楼 a925907195 2016-01-27  
猫哥,赞一个
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 报错
 org.apache.solr.handler.dataimport.SolrWriter -64880 [Thread-18] ERROR org.apache.solr.handler.dataimport.SolrWriter  - Exception while solr commit.
java.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  
files是分词器或者过滤器对应读取的词典文件名,编码必须是UTF-8,

注意这个地方
9 楼 chenbo19867758 2014-09-17  
solr配置报错4.5.1
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  
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  
猫猫,厉害 哈哈哈哈哈!

相关推荐

    mlcsseg, solr分词器大补贴, 包括IK ANSJ、过滤器,动态加载词库.zip

    总结来说,"mlcsseg"项目为Solr用户提供了一套强大的分词工具,包括IK和ANSJ两种优秀的分词器,以及过滤器和动态加载词库功能,这在处理中文文本时极大地提升了搜索质量和效率。对于需要搭建或优化Solr搜索引擎的...

    solr分词器

    Solr分词器是Apache Solr搜索引擎中的一个重要组件,它负责对输入的文本进行分词处理,以便于索引和查询。在理解Solr分词器之前,我们首先要明白Solr是一个开源的企业级搜索平台,它提供了高效、可扩展的全文检索、...

    solr分词器使用手册

    ### Solr分词器使用手册知识点详解 #### 一、Solr概述 - **定义**:Solr是一款基于Java开发的、由Apache基金会维护的顶级开源项目,它是一款高性能的全文检索服务器。Solr不仅继承了Lucene的核心索引与搜索能力,还...

    solr ik分词器

    Solr是中国最流行的开源搜索引擎平台之一,而IK Analyzer是一款针对中文的高性能分词器,尤其在处理现代汉语的复杂情况时表现出色。本教程将详细解释如何在Solr中安装和使用IK分词器。 首先,让我们理解一下什么是...

    自定义Solr分词器

    自定义的Solr 分词器,可以通过竖线"|"来分词,可以在博客http://blog.csdn.net/jiangchao858/article/details/68954044看到生成过程与使用步骤。

    k-analyzer-solr solr分词器

    Solr分词器是搜索引擎Apache Solr中的一个重要组件,它负责对输入的文本进行分析,将其拆分成可索引的基本单元——词语。"k-analyzer-solr" 是一个特定的分词器实现,用于优化Solr的文本处理流程。在Solr中,分词器...

    solr分词器资源 solr-ikanalyzer 资源包

    solr-ik分词器的资源包,包括:ext.dic;ikanalyzer.cfg.xml;ik-analyzer-solr5-5.x.jar;solr-analyzer-ik-5.1.0.jar;stopword.dic 五个文件

    solr中文分词器

    Solr中文分词器是Apache Solr搜索引擎系统中用于处理中文文本的核心组件,它使得Solr能够对中文文档进行有效的索引和搜索。在Solr中,分词器(Tokenizer)是分析器(Analyzer)的一部分,负责将输入的文本拆分成可被...

    IKAnalyzer2012FF_u1 ik solr分词器

    IKAnalyzer2012FF_u1是一款针对中文分词的开源工具,主要应用于搜索引擎和...总之,IKAnalyzer2012FF_u1作为一款成熟的中文分词器,为Solr等搜索平台提供了强大的中文处理能力,极大地提升了中文信息处理的效率和效果。

    solr分词器-ik-analyzer.7.4.0.jar

    solr分词器,solr分词器-ik-analyzer.7.4.0.jar7.4.0版本

    solr中文分词jar包ik-analyzer 含class配置 ik-analyzer-7.5.0

    1. **下载与解压**:获取ik-analyzer-7.5.0.jar文件,解压缩后将jar包放入Solr的lib目录下,确保Solr运行时能加载到该分词器。 2. **配置Solr schema.xml**:在Solr的schema.xml文件中,定义字段类型(fieldType),...

    solr7.3.1中文分词器

    描述中提到的"solr7.3.1种需要的中文IK分词器",IK(Intelligent Chinese Analyzer)分词器是一个强大的、成熟的中文分词组件,广泛应用于各种Java开发的搜索系统中。IK分词器支持多种分词模式,包括精确模式、全...

    Solr分词项目工程实例

    总结,Solr分词项目工程实例涵盖了从配置分词器和过滤器到实际应用的过程,涉及到文档解析、分词、过滤等关键技术,通过"data"文件导入数据并建立索引,实现高效、精准的全文搜索。在实际操作中,开发者需要根据业务...

    JAVA+Solr分词项目工程实例Java实用源码整理learns

    2. **分词**:Solr支持多种分词器,如中文分词器,能将中文文本拆分成有意义的词语,便于搜索。 3. **多字段搜索**:Solr允许对多个字段进行独立或组合的搜索,提供了丰富的查询语法。 4. **高亮显示**:搜索结果...

    支持solr5.5 solr6.0中IK分词需要的资料

    标题和描述提到的是针对Solr 5.5和Solr 6.0版本的IK分词器支持的相关资料,这意味着这些资源可能包括配置文件、文档、示例代码或者更新日志,帮助用户在这些特定版本的Solr中集成和优化IK分词器。 首先,让我们来看...

    solr分词器IKAnalyzer

    **Solr分词器IKAnalyzer详解** Solr是一款强大的全文搜索引擎服务器,而IKAnalyzer是针对中文的开源分词器,广泛应用于Solr和Elasticsearch等搜索引擎中。IKAnalyzer的设计目标是提供一个灵活且易扩展的中文分词...

Global site tag (gtag.js) - Google Analytics