如果已经有了一个自定义的分词库,那要怎么才能集成到Solr里面去呢,本文带你一步一步入坑–不对–,带你集成自定义分词库。

如果还没有自定义的分词库,希望写自己的Solr分词插件,可以先参考自定义Lucene的分词器Analyzer

根据自定义Lucene的分词器Analyzer一文,假设现在已经具备了DemoTokenizer类。因为在Solr里面可以只需要Tokenizer就可以了,而不一定需要Analyzer。

先看一下Solr里schema配置分词的定义:

1
2
3
4
5
6
7
<fieldType name="text_demo" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="com.example.lucene.DemoTokenizerFactory" wordType="hello" />
    <!-- some other filters -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

这里配置了一个字段类型为text_demo,使用了com.example.lucene.DemoTokenizerFactory这个工厂方法来处理对应字段的分词,同时还设置了一个属性wordType值为hello,在后面的代码中读取这个属性的值。这里配置了DemoTokenizerFactory分词处理类,那么就必须要有这么一个类了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.example.lucene;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.util.AttributeFactory;
import java.util.Map;

// 需要继承org.apache.lucene.analysis.util.TokenizerFactory类并实现create方法
public class DemoTokenizerFactory extends TokenizerFactory {

    // 可以保存在上面schema定义的额外的属性参数
    private String wordType = "";

    // 需要一个构造方法,通过构造方法的args参数来读取schema设置的自定义的参数
    public DemoTokenizerFactory(Map<String, String> args) {
        super(args);
        // 调用完父类的构造函数后,可以读取schema里tokenizer节点定义的wordType参数
        // 保存在类属性里面,然后在create方法来使用这个传入的参数
        wordType = args.getOrDefault("wordType", "");
    }

    @Override
    public Tokenizer create(AttributeFactory factory) {
        // 在这里直接new一个tokenizer对象即可
        return new DemoTokenizer();
    }
}

通过上面定义的DemoTokenizerFactory工厂类,就可以提供Solr需要的自定义分词功能了。如果你的自定义分词器需要额外的参数,比如调用一个rest api来进行分词,需要一个host和port,就可以通过在schema定义属性的办法来使分词可以更有弹性和适应不同的rest api而不需要改Solr自定义分词代码。

最后记得添加依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<dependencies>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>7.2.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>7.2.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>