`
zcz123
  • 浏览: 158678 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类

solr配置IK动态扩展词库和动态同义词

 
阅读更多


  本篇文章是基于solr4.3+tomcat8.0.24+IK2012搭建的,solr4.3如何搭建这边就不在叙述,这方面资料很多。

solr4.3配置需要注意solr home的配置,我这边是采用

 

IK配置词库,IK的配置文件放在这里

 

扩展词库和停用词,配置在这个文件里面,对应文件在此目录下

 

一般我们用到的这些就够了,但是如果要想动态添加词库,这样还不能满足,我上网查找资料,发现有人有对IK分词进行修改,可以实现动态加载词库,原理是实现lunce的ResourceLoaderAware接口,配置IK分词类型的处理器,让solr搜索器启动的时候去调用IK处理器的初始方法,初始方法除了加载IK自己的主词库和扩展词库外,还开启一个30秒的定时器去轮询检查ik.conf配置文件是否发送变化,发送变化重新加载扩展词库。

配置文件的核心配置这边截图下:

 



 

 



 

IK的扩展词库和同义词配置需要用到修改IK源码,这块附件有。

具体的配置,我把对应内容复制进来

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)

4. 一些经验

1. 我们并没有去修改分词器逻辑(IK调整了点智能分词算法),因此效果如何就不是特别关心的事了。如果要将单字切分出来,就把单字作为扩展字库。

2. 目前IK扩展词库支持同义词词库格式,但ansj的还不支持同义词词库格式。

3. 默认zookeeper保存1M大小的文件,cloud模式下如果扩展词库过大,需要切成很多份来使用。

4. 需要照顾查全率的时候,可以在index时候使用多切,query时候用智能切分,但这种方式必然可能会出现index切分不能完全包含query切分;也可以index,query都使用多切分的方式,但这样同义词就用得不方便了(例如“颜色”“色彩”是同义词,你期望query时的同义扩展,即搜“色彩”时候也能匹配到“颜色”,但多分可能导致“彩”字出现,而索引却没有;如果讲同义扩展放到index这边,那么修改同义词库时候就必须重建一次索引)。

总结

ik的效率并不太好,我们希望重新实现一个简单高效的分词器。如果有时间会加入mmseg4j的接口。

具体参考:http://mlcsdev.iteye.com/blog/2037109

  • 大小: 30.5 KB
  • 大小: 25.1 KB
  • 大小: 43.2 KB
  • 大小: 67.4 KB
  • 大小: 82.9 KB
分享到:
评论

相关推荐

    IKAnalyzer分词及solr4103配置说明

    6. **测试与应用**:使用Solr提供的Admin界面或API进行索引和查询,观察IKAnalyzer与同义词功能的效果。 **Markdown格式的配置说明** 配置文件通常使用Markdown格式编写,因为其语法简洁明了,易于阅读和编辑。...

    IKAnalyzer 适用 lucene和solr 5.4.0版本(新)

    - **模糊搜索**:支持短语搜索和同义词搜索,增强用户查询体验。 - **停用词处理**:自动过滤掉常见的停用词,如“的”、“是”等,减少无关信息对搜索结果的影响。 总的来说,IKAnalyzer 是一个强大的中文分词工具...

    solr6.0中IK分词需要的资料

    Solr 6.0 是一个强大的全文搜索引擎,它允许开发者对海量数据进行高效、精确的检索。...在实际应用中,根据具体的业务场景,可能还需要结合其他技术,如停用词过滤、同义词扩展等,以进一步提升搜索体验。

    配置好的solr启动环境

    1. **同义词**:在Solr中,可以使用Solr的同义词扩展来处理词汇的同义关系。例如,"车"和"汽车"可以视为同义词,当用户搜索"车"时,也能匹配到包含"汽车"的文档。这通过配置同义词文件和同义词过滤器实现。 2. **...

    IK中文分词器

    同时,用户可以通过插件机制扩展其功能,如停用词过滤、同义词替换等。 总的来说,IKAnalyzer作为中文分词领域的优秀工具,不仅提高了中文文本的处理效率,而且简化了开发流程,降低了系统集成的复杂度,是构建高...

    solr技术方案.pdf

    除了分词,Solr还支持词库与同义词管理。这在处理股票代码等特殊需求时非常有用,因为它们可以被视为同义词。Solr允许我们创建和管理词典,从而提供更智能的搜索体验。 数据导入是Solr的另一个重要功能,它提供了...

    IKAnalyzer包

    通过调整IKAnalyzer的参数,如停用词表、同义词库等,我们可以进一步优化分词结果,提升搜索体验。 总的来说,IKAnalyzer2012_u6是一个专门用于Solr的中文分词工具,它的使用涉及Solr的配置、分词器的选择以及版本...

    IKAnalyzer2012FF_hf1.zip

    同时,它还支持同义词扩展,能够提升搜索的召回率。 7. **扩展性**:IK Analyzer提供插件机制,可以方便地添加新的分词策略或功能,比如短语匹配、关键词提取等。这种灵活性使得IK Analyzer能适应不断变化的自然...

    人工智能-项目实践-搜索引擎-基于solr的中文搜索引擎框架

    在实际操作中,我们首先需要设置Solr服务器,配置适合中文处理的分析器,如IK Analyzer或jieba分词库。然后,我们会导入和处理中文数据,创建索引,以便快速查询。此外,还需要编写前端界面,让用户可以输入查询并...

    analysis-ik-online:IKAnalyzer多分词配置、在线词典管理和热重载

    基于IKAnalyzer深度定制拓展的一款分析器插件,支持特殊字符、数值、字母的分词策略,支持词典在线管理和热重载,支持多分析器多词库配置。 为便于开发调试,项目中直接集成了Solr和Elasticsearch的单机、集群调试...

    solr-web-5.3.1:solr-web-5.3.1的项目原始码,包括自定义lucene的QueryParser及servlet

    例如,可能增加了对模糊查询、同义词处理或自定义排序的支持。 此外,描述还提到实现上传词库到 ik 分词的词库文件中。Ik 分词器是广泛使用的中文分词库,它可以将中文文本拆分成可搜索的词语。在 Solr 中,使用...

    ik-analyzer:自动从code.google.compik-analyzer导出

    3. **同义词处理**: ik-analyzer可以通过扩展配置,支持同义词库,从而实现对同义词的检索。 4. **多字段分词**: 在Solr中,ik-analyzer可以针对不同的字段应用不同的分词策略,满足复杂的信息检索需求。 **ik-...

    分词器6659282.zip

    过滤器可以进一步修改分词器产生的结果,比如去除数字、标点符号,或者执行同义词替换。查询分析器则负责处理用户的查询字符串,确保它们与索引中的分词保持一致。 总结来说,"分词器6659282.zip"是一个与Solr搜索...

Global site tag (gtag.js) - Google Analytics