C# 在Lucene.NET中查找首字母缩略词时遇到问题

C# 在Lucene.NET中查找首字母缩略词时遇到问题,c#,lucene.net,search,C#,Lucene.net,Search,我目前正在开发Lucene.NET全文搜索实现。大部分情况下进展很顺利,但我有一些问题围绕着数据中的首字母缩略词 作为一个例子,如果我在索引的领域中有“N.A.s.A.”,我可以将其与N.A.s.A.或nasa进行匹配,但N.A.s.A不匹配,即使我进行模糊搜索(N.A.s.A~) 我想到的第一个想法是在索引/搜索之前删除所有的。但这似乎更像是一个解决方案,而不是一个解决方案,我希望得到一个更干净的解决方案 有人能建议任何更改或其他分析仪(目前使用StandardAnalyzer)以更适合匹配此

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

作为一个例子,如果我在索引的领域中有“N.A.s.A.”,我可以将其与N.A.s.A.或nasa进行匹配,但N.A.s.A不匹配,即使我进行模糊搜索(N.A.s.A~)

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

有人能建议任何更改或其他分析仪(目前使用StandardAnalyzer)以更适合匹配此类数据吗?

使用将“N.a.S.a.”标记为“nasa”的,但不会对“N.a.S.a”这样做。这就是为什么您的原始查询同时匹配输入“N.A.s.A”(处理为“nasa”)和输入“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();
}
您可能需要编写一个自定义分析器来处理此场景。一个解决方案是保留原始标记,这样n.a*就可以工作,但您还需要更好地检测首字母缩写。

使用标记“n.a.S.a.”作为“nasa”,但不会这样做。这就是为什么您的原始查询同时匹配输入“N.A.s.A”(处理为“nasa”)和输入“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();
}
您可能需要编写一个自定义分析器来处理此场景。一种解决方案是保留原始标记,这样n.a*就可以工作了,但您还需要更好地检测首字母缩写词