无法在Lucene.NET中搜索缩写词

时间:2009-11-19 02:21:14

标签: c# lucene.net search

我目前正在开发Lucene.NET全文搜索实现。在大多数情况下,它进展顺利,但我在数据中有一些关于首字母缩略词的问题......

作为一个例子,如果我有“N.A.S.A.”在我编入索引的字段中,我能够将其与n.a.s.a匹配。或美国国家航空航天局,但是n.a.s.a与它不匹配,即使我进行模糊搜索(n.a.s.a~)也没有。

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

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

1 个答案:

答案 0 :(得分:1)

StandardAnalyzer使用StandardTokenizer标记'N.A.S.A.'作为'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 *可以工作,但您还需要构建更好的首字母缩略词检测。