2009-11-19 48 views
1

我目前正在研究Lucene.NET全文搜索實現。在大多數情況下,它進行得相當順利,但我有一些問題圍繞數據中的首字母縮寫詞進行旋轉......在Lucene.NET中搜索縮略語的麻煩

作爲一個例子,如果我有「N.A.S.A.」在我索引的領域中,我可以將它與n.a.s.a匹配。或美國國家航空航天局,但是n.a.s.a與它不匹配,即使我進行了模糊搜索(n.a.s.a〜)。

我想到的第一個想法是在索引/搜索之前撕掉所有的。但它似乎更像是一種解決方法而不是解決方案,我希望能得到一個更清晰的解決方案。

任何人都可以建議任何更改或不同的分析器(目前使用StandardAnalyzer),可能更適合匹配這種類型的數據?

回答

1

StandardAnalyzer使用StandardTokenizer這標誌着'N.A.S.A.'作爲'國家航空航天局',但不會這樣做'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 *可以工作,但是您還需要更好地檢測縮寫詞。