使用 Edge N Gram 分析器和字符过滤器创建分析器,用新行替换 space
Create analyzer with Edge N Gram analyzer and char filter which replaces space with new line
我收到了以下类型的文本。
foo bar
、hello world
等
我使用 Edge NGram 标记器创建了一个分析器,并使用它在标记下方创建的分析 api。
{
"tokens": [
{
"token": "f",
"start_offset": 0,
"end_offset": 1,
"type": "word",
"position": 1
},
{
"token": "fo",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 2
},
{
"token": "foo",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 3
},
{
"token": "b",
"start_offset": 4,
"end_offset": 5,
"type": "word",
"position": 4
},
{
"token": "ba",
"start_offset": 4,
"end_offset": 6,
"type": "word",
"position": 5
},
{
"token": "bar",
"start_offset": 4,
"end_offset": 7,
"type": "word",
"position": 6
}
]
}
但是当我在我的代码中将文本 "foo bar" 传递给方法 tokenStream 时,它会为 foo bar 创建以下标记.
f, fo, foo, foo , foo b, foo ba, foo bar.
这导致 analyze api 返回的标记不匹配。我想知道如何 添加一个字符过滤器来删除文本中的 space 并对文本中的各个术语应用 Edge NGram 分词器。
因此,在 foo bar 示例中,它应该创建以下令牌。当我调用 tokenStream 方法时。
f, fo, foo, b, ba, bar.
我尝试将字符过滤器添加到我的 java 创建分析器的代码中。下面是它的代码。
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
NormalizeCharMap normalizeCharMap = new NormalizeCharMap();
normalizeCharMap.add(" ", "\u2424");
Reader replaceDots = new MappingCharFilter(normalizeCharMap, reader);
TokenStream result = new EdgeNGramTokenizer(replaceDots, EdgeNGramTokenizer.DEFAULT_SIDE, 1, 30);
return result;
}
但它需要 lu2424
原样。另外请让我知道我的分析器代码是否正确?
您使用分析 API 测试的是 edge-ngram token filter, which is different from an edge-ngram tokenizer。
在您的代码中,如果您希望代码中的行为与使用分析 API.[=13 测试时相同,则需要将 EdgeNGramTokenizer
替换为 EdgeNGramTokenFilter
=]
我收到了以下类型的文本。
foo bar
、hello world
等
我使用 Edge NGram 标记器创建了一个分析器,并使用它在标记下方创建的分析 api。
{
"tokens": [
{
"token": "f",
"start_offset": 0,
"end_offset": 1,
"type": "word",
"position": 1
},
{
"token": "fo",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 2
},
{
"token": "foo",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 3
},
{
"token": "b",
"start_offset": 4,
"end_offset": 5,
"type": "word",
"position": 4
},
{
"token": "ba",
"start_offset": 4,
"end_offset": 6,
"type": "word",
"position": 5
},
{
"token": "bar",
"start_offset": 4,
"end_offset": 7,
"type": "word",
"position": 6
}
]
}
但是当我在我的代码中将文本 "foo bar" 传递给方法 tokenStream 时,它会为 foo bar 创建以下标记.
f, fo, foo, foo , foo b, foo ba, foo bar.
这导致 analyze api 返回的标记不匹配。我想知道如何 添加一个字符过滤器来删除文本中的 space 并对文本中的各个术语应用 Edge NGram 分词器。
因此,在 foo bar 示例中,它应该创建以下令牌。当我调用 tokenStream 方法时。
f, fo, foo, b, ba, bar.
我尝试将字符过滤器添加到我的 java 创建分析器的代码中。下面是它的代码。
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
NormalizeCharMap normalizeCharMap = new NormalizeCharMap();
normalizeCharMap.add(" ", "\u2424");
Reader replaceDots = new MappingCharFilter(normalizeCharMap, reader);
TokenStream result = new EdgeNGramTokenizer(replaceDots, EdgeNGramTokenizer.DEFAULT_SIDE, 1, 30);
return result;
}
但它需要 lu2424
原样。另外请让我知道我的分析器代码是否正确?
您使用分析 API 测试的是 edge-ngram token filter, which is different from an edge-ngram tokenizer。
在您的代码中,如果您希望代码中的行为与使用分析 API.[=13 测试时相同,则需要将 EdgeNGramTokenizer
替换为 EdgeNGramTokenFilter
=]