我试图测试同义词Graph但是没有按预期工作,也没有返回正确的答案。
这是我的自定义分析器中的createComponents自定义方法
public SuggestAnalizer(SynonymMap synonymMap) {
this.synonymMap = synonymMap;
this.stopList = Collections.emptyList();
}
@Override
protected TokenStreamComponents createComponents(String s) {
Tokenizer tokenizer = new StandardTokenizer();
TokenStream tokenStream = new SynonymGraphFilter(tokenizer, synonymMap, true);
tokenStream = new FlattenGraphFilter(tokenStream);
return new TokenStreamComponents(tokenizer, tokenStream);
}
这是测试代码
String entrada = "ALCALDE KOOPER";
String salida = "FEDERICO COOPER";
SynonymMap.Builder builder = new SynonymMap.Builder(true);
CharsRef input = SynonymMap.Builder.join(entrada.split(" "), new CharsRefBuilder());
CharsRef output = SynonymMap.Builder.join(salida.split(" "), new CharsRefBuilder());
builder.add(output, input, true);
suggestAnalizer = new SuggestAnalizer(builder.build());
TokenStream tokenStream = suggestAnalizer.tokenStream("field", entrada2);
assertTokenStreamContents(tokenStream, new String[]{
"FEDERICO"
});
assertAnalyzesTo(suggestAnalizer, entrada, new String[]{
"FEDERICO"
});
我预计断言会为她的同义词“FEDERICO COOPER”更改“ALCALDE KOOPER”字符串,但这不会发生。
有人知道我的错误在哪里或我的代码无效?
答案 0 :(得分:0)
这些行为的原因是您从中添加多字同义词
FEDERICO COOPER
到ALCALDE KOOPER
(在代码中,我看到从输出(FEDERICO COOPER
)添加到输入的链接,即ALCALDE KOOPER
)
稍后您正在测试令牌FEDERICO
的同义词,但它没有连接,这就是您获得空响应和断言错误的原因。因此,如果您要将FEDERICO
的同义词添加到ALCALDE
。
但是,即使您这样做,构建SynonymMap
也会出错,您使用ignoreCase
param true
值,这意味着:
用于与Character#toLowerCase(int)匹配的case-folds输入。 注意,如果将其设置为true,则在创建SynonymMap时,您有责任小写输入条目
因此,您需要在测试中使用小写版本或将ignoreCase
设置为false
您可以查看参考代码here