为什么测试SynonymGraphFilter Lucene不起作用?

时间:2017-02-21 21:08:56

标签: lucene synonym

我试图测试同义词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”字符串,但这不会发生。

有人知道我的错误在哪里或我的代码无效?

1 个答案:

答案 0 :(得分:0)

这些行为的原因是您从中添加多字同义词 FEDERICO COOPERALCALDE KOOPER(在代码中,我看到从输出(FEDERICO COOPER)添加到输入的链接,即ALCALDE KOOPER

稍后您正在测试令牌FEDERICO的同义词,但它没有连接,这就是您获得空响应和断言错误的原因。因此,如果您要将FEDERICO的同义词添加到ALCALDE

但是,即使您这样做,构建SynonymMap也会出错,您使用ignoreCase param true值,这意味着:

  

用于与Character#toLowerCase(int)匹配的case-folds输入。   注意,如果将其设置为true,则在创建SynonymMap时,您有责任小写输入条目

因此,您需要在测试中使用小写版本或将ignoreCase设置为false

您可以查看参考代码here