Lucene.Net 具有多个单词短语的同义词过滤器

Lucene.Net SynonymFilter with multiple word phrases

我正在使用 Lucene.net 并尝试实现 SynonymFilter 以在我的产品数据库中的项目可以不同命名或拼写时提供扩展术语 - 例如"spanner" > "wrench",或 "lawnmower" > "lawn mower".

作为测试,我设置了一个 SynonymMap,如下所示:

String base1 = "lawnmower";
String syn1 = "lawn mower";
String base2 = "spanner";
String syn2 = "wrench";

SynonymMap.Builder sb = new SynonymMap.Builder(true);
sb.Add(new CharsRef(base1), new CharsRef(syn1), true);
sb.Add(new CharsRef(base2), new CharsRef(syn2), true);
SynonymMap smap = sb.Build();

搜索 "spanner" 或 "wrench" 会返回包含其中一个词的所有术语。搜索 "lawn mower" 或 "lawnmower" 只会返回与输入搜索完全匹配的术语标准。

对于同义词中的多个单词短语,是否还需要做其他事情?

另外,我如何扩展说出 3 个或更多术语,例如 "lawnmower"、"lawn mower"、"mower"、"grass cutter"?

谢谢

单元测试中有 an example 个多词同义词。你必须自己拆分单词并在它们之间插入一个 SynonymMap.WORD_SEPARATOR (空字符)。为了使这更容易,SynonymMap.Builder.

上有一个 Join 方法
String base1 = "lawnmower";
String syn1 = "lawn mower";

SynonymMap.Builder sb = new SynonymMap.Builder(true);
CharsRef syn1Chars = sb.Join(Regex.Split(syn1, " +"), new CharsRef());
sb.Add(new CharsRef(base1), syn1Chars, true);
SynonymMap smap = sb.Build();

这里有一个扩展方法可以快速解决这个问题。

public static class SynonymMapBuilderExtensions
{
    private static Regex Space = new Regex(" +", RegexOptions.Compiled);

    public static void AddPhrase(this SynonymMap.Builder builder, string input, 
        string output, bool keepOrig)
    {
        CharsRef outputRef = builder.Join(Space.Split(output), new CharsRef());
        builder.Add(new CharsRef(input), outputRef, keepOrig);
    }
}

然后,无论同义词是否包含空格,您都可以使用此扩展方法,并且如果您在代码的其他任何地方不需要它们,则不必费心创建 CharsRef 对象。

String base1 = "lawnmower";
String syn1 = "lawn mower";
String base2 = "spanner";
String syn2 = "wrench";

SynonymMap.Builder sb = new SynonymMap.Builder(true);
sb.AddPhrase(base1, syn1, true);
sb.AddPhrase(base2, syn2, true);
SynonymMap smap = sb.Build();