我正在使用Lucene.net并尝试实施SynonymFilter,以便在我的产品数据库中的项目可以以不同方式命名或拼写不同时提供扩展条款 - 例如"扳手" > "扳手",或"割草机" > "割草机"。
作为测试,我按如下方式设置了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();
搜索"扳手"或者"扳手"用任何一个单词带回所有术语。搜索"割草机"或者"割草机"只返回与输入搜索条件完全匹配的术语。
在同义词中是否还需要为多个单词短语做些什么?
另外,我如何扩展为3个或更多术语,例如"割草机","割草机","割草机","草刀具"
由于
答案 0 :(得分:2)
单元测试中有多个单词同义词an example。您必须自己拆分单词并在它们之间插入com.example.test
(空字符)。为方便起见,SynonymMap.WORD_SEPARATOR
上有一个Join
方法。
SynonymMap.Builder
这是一种快速解决此问题的扩展方法。
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