本篇文章是基于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的接口。
相关推荐
可做为电商搜索引擎solr的扩展词库,20W+专业名词,txt文件可修改后缀名,不定时更新。
solr 全文检索系统配置IK 分词器的jar包 和相关的配置文件。
支持solr5.5 solr6.0中IK分词需要的资料
电商搜索引擎solr的扩展词库,20W+的专业名词,txt文件;
solr配置ikanalyzer分词文件以使用说明
solr安装ik分词器将jar复制到solr\WEB-INF\lib 中 具体使用:https://mp.csdn.net/postedit
solr导入Ik分词专用。
solr的同义词库,文档是从其他地方拿的,放到这里供大家下载,共2万1千条
solr6.6-IK分词 solr6.6-IK分词 solr6.6-IK分词 solr6.6-IK分词 solr6.6-IK分词 solr6.6-IK分词 solr6.6-IK分词
solr4.10.3+IK Analyzer For Solr4.x 发现资源不太好找,或者比较“贵 ” 自己发一个
IK分词solr5.0.0
solr-ik中文分词器资源包,包括ext.dic,,IKAnalyzer.cfg.xml,,ik-analyzer-solr5-5.x.jar,,managed-schema,,solr-analyzer-ik-5.1.0.jar,,stopword.dic solr-ik分词 solr中文分词 ik分词资源
Solr的ik分词以及mysql-connector-java-8.0.11,没积分call我,我发给你
压缩包内含有solr+ik如何配置的详细介绍以及solr+ik的包,省去了自己去找地址下载的麻烦,经测试使用完全可以在电商电商项目中实现全文检索
solr7.2.1,IK分词jar包,使用Solr进行Ik分词的时候需要使用该jar包
Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。IK中文分析器
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。此包兼容solr7.x
solr 中文查询分词器,把一串字符分作多个词语进行查询