网上其他关于IK分词器的介绍一般都是从文本文件中加载词库,我根据网上下载的ik分词器jar包,反编译后,修改了源码,支持从数据库定时增量导入词库。同时也支持从文本文件中导入词库,但没有定时增量导入的功能。
1、下载ik-analyzer-solr-dc-5.2.1.jar并上传到/opt/solr-5.2.1/server/solr-webapp/webapp/WEB-INF/lib
2、修改/opt/solr/server/solr/configsets/data_driven_schema_configs/conf/managed-schema文件
(1)定义类型
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
或者使用下面的方式:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false">
<!--Tokenizer:接收text(通过从solr那里获得一个reader来读取文本),拆分成tokens,输出token stream-->
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
<!--Filter:接收token stream,对每个token进行处理(比如:替换、丢弃、不理),输出token stream-->
<!--因此,在配置文件中,Tokenizer放在第一位,Filter放在第二位直到最后一位。-->
<!--由于filters是顺序执行的,前一个的结果是后一个是输入,所以,一般通用的处理放在前面,特殊的处理靠后-->
<!--<filter class="solr.StandardFilterFactory"/> -->
</analyzer>
<analyzer type="query" useSmart="false">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
</analyzer>
</fieldType>
(2)使用类型
<field name="text" type="text_ik" indexed="true" stored="true" multiValued="false" />
3、如果要自定义词库时,需要执行这步骤。
(1)准备IKAnalyzer.cfg.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典,如果有多个,用分号分割 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典,如果有多个,用分号分割-->
<entry key="ext_stopwords">stopword.dic;</entry>
<!--如果需要从数据库中定时更新词库到solr里,则需要如下配置-->
<!--数据库url、数据库用户名、密码、那张表-->
<entry key="database_url">jdbc:mysql://192.168.1.222:3306/test</entry>
<entry key="user_name">root</entry>
<entry key="password">123456</entry>
<entry key="table_name">t_tict</entry>
<!--table_name表中的一个字段,long或int型,类似于主键,全表唯一索引,用于solr记录以前更新到了那条数据,key必须为seq_no,值为数据库字段-->
<entry key="seq_no">seq_no</entry>
<!--定时更新时间间隔,单位为秒-->
<entry key="period">60</entry>
</properties>
(2)准备ext.dic和stopword.dic文件,这2个文件就是普通的文本文件,每行一个词,注意最好用notepad++以UTF-8无BOM格式编码。
比如在ext.dic中输入:魔兽世界,那么在分词的时候就会分为魔兽世界、魔兽、世界三个词,如果没有自定义词库,那么ik会将其分为魔兽、世界两个词。
stopword.dic:停顿词,一般用没有实际意义的词,比如:啊、等、等等、虽然、但是
(3)将上述文件上传到各个节点的/opt/solr-5.2.1/server/solr-webapp/webapp/WEB-INF/classes目录下(如果没有classes文件夹,需要自己创建)
4、重启各节点的solr服务