【问题标题】:Build Lucene Synonyms构建 Lucene 同义词
【发布时间】:2023-03-22 23:43:01
【问题描述】:

我有以下代码

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"));

我期待这两个案例都能成功运行,但美国联盟与“a.l.”不匹配除了“a.l.”和“americanleague”是“al”的同义词。

那么,我该怎么办?我不想将所有组合添加到地图中。谢谢

【问题讨论】:

    标签: lucene synonym


    【解决方案1】:

    我相信你对builder.add 的论点倒退了。试试:

    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);
    

    SynonymFilter 只是从第一个 arg(输入)映射到第二个 arg(输出),而不是相反。所以你有规则将“al”翻译成两个不同的同义词,但没有对“a.l.”的输入做任何事情。或“美国联赛”。

    【讨论】:

    • 是的,但是如果我有 5 个应该用作同义词的单词会怎样?在构建器中我需要多少个映射?
    • 我会说 4 或 5。您可能需要从每个同义词到某个常用词的映射,这些词将在索引中代表它们中的任何一个。在您给出的情况下,您将映射“americanleague”->“al”和“a.l.” -> "al",所以你有两个规则的三个同义词。只要在查询和索引时应用 SynonymFilter,就不需要尝试枚举所有可能的组合。
    • 根据我的测试,我还需要映射双方。 al -> a.l.和 a.l. -> 人。此外,您提到的及物性对我也不起作用。用3个字,我至少需要映射a1-a2, a2-a1, a1-a3, a3-a1, a2-a3, a3-a2
    • 听起来您在查询和索引时没有应用相同的分析器。我通常如何使用 SynonymFilter 将生成一个单向映射,将keepOrig 设置为false,并在索引文档和运行查询时应用它,例如术语“americanleague”和“a.l.”永远不会以文档(当然,存储的数据除外)或查询的后分析形式出现。
    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多