创建空白字符过滤器
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
}
}
}
}
我想使用带有模式分词器和自定义分词过滤器的自定义分析器。但是,在那一步之前,我想在每个空格上制作标记。我知道,我可以使用空白分析器,但我也想使用我的自定义分析器。
基本上,我想在字符串中的每个特殊字符和空格上生成一个标记。
比如我有一个字符串“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
}
}
}
}