今天介绍下怎么样编写一个自己的分词插件,开始之前,先介绍下ES的项目结构:
分别介绍下吧:
.idea:IDEA的项目配置文件
bin:可执行脚本文件
config:配置文件
gradle:精简版的gradle
lib:里面主要放了sigar用来做资源监控
modules:ES主要模块在这里了
plugins:插件都放这里啦
plugins里面按类型分了好多目录,今天我们来看怎么自定义一个分词插件,所以放analysis目录里面。
我们先移植一个开源的IKAnalyzer到ES里面吧。
第一步,先在plugins下建立目录ik
完整路径如下:elasticsearch\plugins\analysis\ik
下面建立src目录和build目录、并建立文件build.gradle(内容从icu里面的build.gradle拷贝出来,然后做相应的调整,如下图所示)
第二步,新建目录src/main/java/org
第三步,在java下新建配置文件es-plugin.properities,里面一行指定当前插件的入口类(实现ES插件接口的类),如下图所示
第四步,在.idea目录里面,找到modules.xml,将我们自定义的module添加到工程中,注意路径,完了之后,会发现plugin下面的ik目录会变粗,说明该目录已经成为了项目中的一个module了。
第五步,在.idea/modules目录里面新建插件的配置文件如plugin-analysis-ik.iml,内容有下图所示
第六步,右键点击项目,选择Open Module Setting
应该会看到ik的模块配置,选中,然后分别设置目录的属性(有排除、源代码、测试三种),设置好之后如下图所示
第七步,在.idea/modules/里面的elasticsearch-root.iml加上一句,将我们的自定义module添加进去,如下图所示
最后一步,在elasticsearch根目录的setting.gradle文件里,添加一行来打包ik,如下图所示
配置的工作基本上到此结束,接着就是实现自己的AnalyzerProvider和AbstractPlugin了,具体代码可以看这里https://github.com/medcl/elasticsearch/commit/21abad12a0096173e8836dd042ca403751ab7ad1,就不一一列举了。
开始试验一下吧,默认bootstrap模式会加载所有插件,所有可以直接使用ik-analysis的插件。
通过服务端的日志,可以看到正确加载词库了。
刚刚分词的结果页出来了,ik正确加载了我自定义的词组“脑残片”,分词的结果也是正确的