ElasticSearch的ik分词插件开发

 ik插件,说白了,就是通过封装ik分词器,与ElasticSearch对接,让ElasticSearch能够驱动该分词器。那么,具体怎么与ElasticSearch对接呢?从下往上走,总共3步:

一、封装IK分析器

    与ElasticSearch集成,分词器的配置均从ElasticSearch的配置文件读取,因此,需要重载IKAnalyzer的构造方法,然后继承ElasticSearch的类AbstractIndexAnalyzerProvider。代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  IkAnalyzerProvider  extends  AbstractIndexAnalyzerProvider<IKAnalyzer> {
     private  final  IKAnalyzer analyzer;
 
     @Inject
     public  IkAnalyzerProvider(Index index,  @IndexSettings  Settings indexSettings, 
              Environment env,  @Assisted  String name,  @Assisted  Settings settings) {
         super (index, indexSettings, name, settings);
         Dictionary.initial( new  Configuration(env));
         analyzer= new  IKAnalyzer(indexSettings, settings, env);
     }
 
     @Override  public  IKAnalyzer get() {
         return  this .analyzer;
     }
}

    由于词库的配置也是从ElasticSearch的配置文件中读取,因此Dictionary也需要重载初始化方法。以上代码实现了一个分词策略供应器,这个供应器主要提供IK分析器。接下来,需要把这个供应器与ElasticSearch进行绑定。

二、绑定IK分析器

    分析器的绑定需要继承绑定处理器AnalysisModule.AnalysisBinderProcessor,代码如下:  

?
1
2
3
4
5
6
7
8
public  class  IkAnalysisBinderProcessor  extends  AnalysisModule.AnalysisBinderProcessor {
 
     @Override  public  void  processAnalyzers(AnalyzersBindings analyzersBindings) {
         analyzersBindings.processAnalyzer( "ik" , IkAnalyzerProvider. class );
         super .processAnalyzers(analyzersBindings);
     }
 
}

   现在绑定处理器已经实现,下面是如何是IK分析器成为ElasticSearch的插件。

三、与ElasticSearch插件关联

    继承AbstractPlugin,定义一个插件名称,方便在ElasticSearch配置文件里指定插件使用,定义一个简单的插件描述。,然后将ik绑定处理器加入ElasticSearch的分析模块。  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  class  AnalysisIkPlugin  extends  AbstractPlugin {
 
     @Override  public  String name() {
         return  "analysis-ik" ;
     }
 
 
     @Override  public  String description() {
         return  "ik analysis" ;
     }
 
 
     @Override  public  void  processModule(Module module) {
         if  (module  instanceof  AnalysisModule) {
             AnalysisModule analysisModule = (AnalysisModule) module;
             analysisModule.addProcessor( new  IkAnalysisBinderProcessor());
         }
     }
}

    以上只是与ElasticSearch对接的处理,之后还有一些IK的类需要调整,比如IKAnalyzer的构造方法需要重载,Dictionary的初始化方法也需要重载,Configuration的构造方法也需要重载等等,这些类根据不同的情况,构造重载实现也不一样。

 

http://my.oschina.net/xiaohui249/blog/268907

你可能感兴趣的:(ElasticSearch的ik分词插件开发)