我收到以下类型的文字。
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,foob,fooba,foo bar。
这导致 analyze 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
为准。还请让我知道我的分析器代码是否正确?
答案 0 :(得分:1)
您使用分析API测试的是edge-ngram token filter,与edge-ngram tokenizer不同。
在代码中,如果您希望代码中的行为与使用analyst API测试的行为相同,则需要用barcodescanner
.scan({
...
})
.then(
(result) => {
console.log("Scan format : " + result.format);
console.log("Scan text : " + result.text);
this.text = result.text;
},
(error) => {
console.log("No scan: " + error);
}
);
}
替换EdgeNGramTokenizer
。