我正在使用 Lucene.net,并尝试实现 SynonymFilter 以在产品数据库中的项目可以不同命名或拼写不同时提供扩展术语 - 例如“ Spanner ”>“ Spanner ”,或“割草机”>“割草机”。
作为测试,我设置了一个 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 个或更多术语,例如“割草机”、“割草机”、“割草机”、“割草机”?
谢谢
最佳答案
有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();
关于Lucene.Net SynonymFilter 具有多个单词短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264371/