背景:
Ik分词器支持默认分词器,可以扩展分词词典,但想扩展一个分词器类型就需要个性IK源码了,扩展后的分词器与原生分词器可混用,也可单独使用。
下面简单介绍下修改过程同大家分享共同学习。
过程:
1、克隆IK源码并测试IK插件
1)克隆地址:https://github.com/medcl/elasticsearch-analysis-ik
要根据你目前使用的es版本找到合适IK的版本,版本选择:
2)这里面有个坑如你的ES是6.7.1,IK克隆的也是6.7.1当编译好后,发现报IK插件与ES版本不一至问题,
(报错代码:Caused by: java.lang.IllegalArgumentException: Plugin [analysis-ik] was built for Elasticsearch version 6.5.0 but version 6.7.1 is running)
这是因为IK6.7.1发布的ES版本为6.5.0,所以需要修改pom文件中的版本如下:
<elasticsearch.version>6.5.0</elasticsearch.version>
修改为
<elasticsearch.version>6.7.1</elasticsearch.version>
3)测试IK编译插件
加载项目后进行maven package 编译打包,解压target/releases/elasticsearch-analysis-ik-6.7.1.zip,修改文件名为IK,复制到es的home下的plugins文件夹中后启动ES,如无报错信息 使用_analyzer进行测试是否成功安装IK分词器。
2、修改源码扩展小区分词器
1)IK与ES是通过plugin.analysis.ik.AnaysisIkPlugin类的Map进行配合使用,那么请记住这块后面开发完分词要添加在这个地方给ES使用。
public class AnalysisIkPlugin extends Plugin implements AnalysisPlugin {
public static String PLUGIN_NAME = "analysis-ik";
@Override
public Map<String, AnalysisModule.AnalysisProvider<TokenizerFactory>> getTokenizers() {
Map<String, AnalysisModule.AnalysisProvider<TokenizerFactory>> extra = new HashMap<>();
extra.put("ik_smart", IkTokenizerFactory::getIkSmartTokenizerFactory);
extra.put("ik_max_word", IkTokenizerFactory::getIkTokenizerFactory);
2)扩展 IkAnalyzerProvider和IkTokenizerFactory
通过
extra.put(“ik_smart”, IkTokenizerFactory::getIkSmartTokenizerFactory);
和
extra.put(“ik_smart”, IkAnalyzerProvider::getIkSmartAnalyzerProvider);
为线索找出创建IKAnalyzer类IkAnalyzerProvider实现ES抽象类AbstractIndexAnalyzerProvider来创建IKAnalyzer分词器,这是一个lambda写法,把方法存储到map中使用时传入方法所需的参数,我们仿照这个方法创建自己的分词器就可以了。
public class IkAnalyzerProvider extends AbstractIndexAnalyzerProvider<IKAnalyzer> {
private final IKAnalyzer analyzer;
public IkAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings,boolean useSmart) {
super(