构建Lucene同义词

构建Lucene同义词,lucene,synonym,Lucene,Synonym,我有以下代码 static class TaggerAnalyzer extends Analyzer { @Override protected TokenStreamComponents createComponents(String s, Reader reader) { SynonymMap.Builder builder = new SynonymMap.Builder(true); builder.add(new CharsRef(

我有以下代码

static class TaggerAnalyzer extends Analyzer {

    @Override
    protected TokenStreamComponents createComponents(String s, Reader reader) {

        SynonymMap.Builder builder = new SynonymMap.Builder(true);
        builder.add(new CharsRef("al"), new CharsRef("americanleague"), true);
        builder.add(new CharsRef("al"), new CharsRef("a.l."), true);
        builder.add(new CharsRef("nba"), new CharsRef("national" + SynonymMap.WORD_SEPARATOR + "basketball" + SynonymMap.WORD_SEPARATOR + "association"), true);

        SynonymMap mySynonymMap = null;
        try {
            mySynonymMap = builder.build();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Tokenizer source = new ClassicTokenizer(Version.LUCENE_40, reader);
        TokenStream filter = new StandardFilter(Version.LUCENE_40, source);
        filter = new LowerCaseFilter(Version.LUCENE_40, filter);
        filter = new SynonymFilter(filter, mySynonymMap, true);
        return new TokenStreamComponents(source, filter);
    }
}
我正在做一些测试,到目前为止,一切都很顺利,直到我想出了这个方案

    String title = "Very short title at a.l. bla bla"

    Assert.assertTrue(TagUtil.evaluate(memoryIndex,"americanleague"));
    Assert.assertTrue(TagUtil.evaluate(memoryIndex,"al"));
我原以为这两个案例都能成功,但americanleague与“a.l.”并不匹配。此外,“a.l.”和“americanleague”都是“al”的同义词


那么,我该怎么办?我不想在地图上添加所有的组合。谢谢

我相信你对
builder有自己的论点。向后添加。尝试:

builder.add(new CharsRef("americanleague"), new CharsRef("al"), true);
builder.add(new CharsRef("a.l."), new CharsRef("al"), true);
builder.add(new CharsRef("national" + SynonymMap.WORD_SEPARATOR + "basketball" + SynonymMap.WORD_SEPARATOR + "association"), new CharsRef("nba"), true);

同义词过滤器只从第一个参数(输入)映射到第二个参数(输出),而不是相反。所以你有规则将“al”翻译成两个不同的同义词,但没有规则对“a.l.”或“americanleague”的输入有任何影响。

是的,但是如果我有5个单词可以作为同义词,会发生什么?在生成器中需要多少映射?我会说4或5。您可能需要从每个同义词映射到一些常用词,这些词将在索引中表示它们中的任何一个。在您给出的例子中,您将映射“americanleague”->“al”和“a.l.”->“al”,因此您有三个同义词和两条规则。只要在查询和索引时应用同义词过滤器,就不需要尝试枚举所有可能的组合。al->a.l.和a.l.->al.此外,你提到的及物性对我也不适用。有了3个单词,我需要至少映射a1-a2、a2-a1、a1-a3、a3-a1、a2-a3、a3-a2。听起来您在查询和索引时没有应用相同的分析器。我通常使用同义词过滤器的方式是生成所指示的单向映射,将
keepOrig
设置为false,并在索引文档和运行查询时应用它,这样术语“americanleague”和“a.l.”就不会出现在文档(当然,存储的数据除外)或查询的分析后形式中。