我输入了以下类型的文本。
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 酒吧。
这导致分析api 返回的令牌不匹配。我想知道如何添加一个 char 过滤器来删除文本中的空格并将 Edge NGram 标记器应用于文本中的各个术语。
因此,在foo bar示例中,它应该创建下面的令牌。当我调用tokenStream方法时。
f,fo,foo,b,ba,bar。
我尝试将 char 过滤器添加到我的创建分析器的 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
就像它一样。另外请让我知道我的分析器代码是否正确?