创建空白字符过滤器

Creating a whitespace character filter

我想使用带有模式分词器和自定义分词过滤器的自定义分析器。但是,在那一步之前,我想在每个空格上制作标记。我知道,我可以使用空白分析器,但我也想使用我的自定义分析器。

基本上,我想在字符串中的每个特殊字符和空格上生成一个标记。

比如我有一个字符串“Google的url是https://www.google.com/."

我的标记应该像“Google”、“Google'”、“Google's”、“url”、“是”、“ https"、"https:"、"https:/"、"://"、"//www"、"/www."...等等。

基本上,我想像 n-gram 一样成为我的标记,但只有像下面这样的有限标记,它只会在特殊字符上中断。

我的 tokenizerFactory 文件如下所示:

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.pattern.PatternTokenizer;
import org.elasticsearch.common.regex.Regex;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexSettings;
import org.elasticsearch.index.analysis.AbstractTokenizerFactory;

import java.util.regex.Pattern;

public class UrlTokenizerFactory extends AbstractTokenizerFactory {

    private final Pattern pattern;
    private final int group;

    public UrlTokenizerFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
        super(indexSettings, name, settings);

        String sPattern = settings.get("pattern", "[^\p{L}\p{N}]");
        if (sPattern == null) {
            throw new IllegalArgumentException("pattern is missing for [" + name + "] tokenizer of type 'pattern'");
        }

        this.pattern = Regex.compile(sPattern, settings.get("flags"));
        this.group = settings.getAsInt("group", -1);
    }

    @Override
    public Tokenizer create() {
        return new PatternTokenizer(pattern, group);
    }
}

我的 TokenFilterfactory 文件目前是空的。

您可以在自定义分析器定义中简单地使用 whitespace tokenizer,下面是使用它的 custom_analyzer 示例。

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_custom_analyzer": { --> name of custom analyzer
                    "type": "custom",
                    "tokenizer": "whitespace", --> note this
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "my_custom_analyzer" --> note this
            }
        }
    }
}