【问题标题】:Lucene.Net SynonymFilter with multiple word phrases具有多个词组的 Lucene.Net SynonymFilter
【发布时间】:2017-11-13 12:27:07
【问题描述】:

我正在使用 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();

搜索“spanner”或“wrench”会返回所有包含其中任何一个词的词。搜索“lawn mower”或“lawnmower”只会返回与输入搜索条件完全匹配的词。

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

另外,我如何扩展为 3 个或更多术语,例如“割草机”、“割草机”、“割草机”、“割草机”?

谢谢

【问题讨论】:

    标签: lucene lucene.net synonym


    【解决方案1】:

    单元测试中有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();
    

    【讨论】:

    • 谢谢,这似乎是一种绝对的享受!当我想要 3 个或更多术语相互映射时,如何扩展为 3 个或更多术语,例如“割草机”、“割草机”、“割草机”、“割草机”?我必须将每个变体相互映射吗?
    • 不确定,但这似乎是合理的,这是唯一可行的方法。您可以通过将所有同义词添加到列表中,然后使用 this combinations extension method 添加所有映射来简化添加所有组合。
    • 所以我必须添加 a > b、b > a、a > c、c > a、b > c 和 c > b?我是否希望在构建索引和传入查询中都这样做?在我的源数据中,我可以有不同的术语变体,显然我无法预测人们将如何搜索它。或者仅处理查询以查找所有替代术语是否足够好?添加同义词时是否保留原始值?我无法“看到”正在创建的内容以了解幕后发生的事情,因此我可以制定出最佳方法。
    • 恐怕我对它的工作原理知之甚少,无法为您提供答案,尽管我在某处读到您可以在索引时存储同义词以获得更好的性能。我建议在lucene mailing list(不是 Lucene.Net)上提问,并确保告知他们您使用的是 Lucene 4.8。不幸的是,关于这个主题的documentation 相当少,但是在搜索“lucene 多个同义词”时出现了一些关于使用同义词的文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多