使用边缘 N Gram 分析仪和字符过滤器创建分析器,用新行替换空格



我有以下类型的文本进来。foo barhello 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.

这会导致分析API 返回的令牌不匹配。我想知道如何添加一个字符过滤器来删除文本中的空格,并对文本中的单个术语应用 Edge NGram 分词器。

因此,在foo bar示例中,它应该创建下面的令牌。 当我调用令牌流方法时。

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令牌筛选器,它不同于 edge-ngram标记器

在代码中,如果要在代码中具有与使用 analyze API 测试的行为相同的行为,则需要将EdgeNGramTokenizer替换为EdgeNGramTokenFilter

最新更新