C# 在Lucene.NET中查找首字母缩略词时遇到问题
我目前正在开发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” 这可以在直接从令牌流输出值时看到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)以更适合匹配此
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*就可以工作了,但您还需要更好地检测首字母缩写词