我目前正在开发Lucene.NET全文搜索实现。在大多数情况下,它进展顺利,但我在数据中有一些关于首字母缩略词的问题......
作为一个例子,如果我有“N.A.S.A.”在我编入索引的字段中,我能够将其与n.a.s.a匹配。或美国国家航空航天局,但是n.a.s.a与它不匹配,即使我进行模糊搜索(n.a.s.a~)也没有。
我想到的第一个想法就是在索引/搜索之前删掉所有的。但它似乎更像是一个解决方法而不是一个解决方案,我希望得到一个更清洁的解决方案。
任何人都可以建议任何更改或不同的分析器(目前使用StandardAnalyzer)可能更适合匹配此类数据吗?
答案 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 *可以工作,但您还需要构建更好的首字母缩略词检测。