【问题标题】:Trouble searching for acronyms in Lucene.NET在 Lucene.NET 中搜索首字母缩写词时遇到问题
【发布时间】:2009-11-19 02:21:14
【问题描述】:

我目前正在研究 Lucene.NET 全文搜索实现。在大多数情况下,它进展顺利,但我遇到了一些围绕数据中的首字母缩略词的问题......

作为一个例子,如果我有“N.A.S.A.”会发生什么在我索引的字段中,我可以将它与 n.a.s.a. 匹配。或 nasa,但 n.a.s.a 不匹配,即使我输入了模糊搜索 (n.a.s.a~)。

我想到的第一个想法是在索引/搜索之前删除所有 . ,但这似乎更像是一种解决方法而不是解决方案,我希望得到一个更清洁的解决方案。

任何人都可以提出任何可能更适合匹配此类数据的更改或不同的分析器(目前使用 StandardAnalyzer)吗?

【问题讨论】:

    标签: c# lucene.net search


    【解决方案1】:

    StandardAnalyzer 使用标记“N.A.S.A.”的StandardTokenizer作为'nasa',但不会对'N.A.S.A'这样做。这就是为什么您的原始查询与处理为“nasa”的输入“N.A.S.A”和与已经标记化的值匹配的输入“nasa”都匹配的原因。这也解释了为什么 'N.A.S.A' 不会匹配任何内容,因为索引只包含标记 'nasa'。

    直接从令牌流中输出值时可以看到。

    public static void Main(string[] args) {
        var analyzer = new StandardAnalyzer(Version.LUCENE_30);
        var stream = analyzer.TokenStream("f", new StringReader("N.A.S.A. N.A.S.A"));
    
        var termAttr = stream.GetAttribute<ITermAttribute>();
        while (stream.IncrementToken()) {
            Console.WriteLine(termAttr.Term);
        }
    
        Console.ReadLine();
    }
    

    输出:

    nasa
    n.a.s.a
    

    您可能需要编写一个自定义分析器来处理这种情况。一种解决方案是保留原始标记,以便 n.a* 起作用,但您还需要构建更好的首字母缩写词检测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多