2011-11-14 40 views
1

我使用的是Lucene.Net 2.9.2,我估計我需要編寫一個自定義標記器,但是希望檢查以防萬一我丟失了明顯的東西。Tokenizing Lucene.Net中的關鍵字

該文件由標題,關鍵字和內容以及一些像作者,日期等元數據組成,每個元數據存儲爲一個字段。這些文檔是軟件技術文檔,可能包含標題,關鍵詞和/或內容中的'.Net','C++','C#'等短語。

我對關鍵字字段使用KeywordAnalyzer,標題和內容使用StandardAnalyzer - StopWords和LowerCase等是必要的,因爲文檔可能很長。

我也寫了一個同義詞自定義過濾器搜索,因爲我想搜索,例如'C#',但也承認'CSharp','C#.Net'等。標記化器已經刪除了'#'從'C#'或'++',因此可以與'C'語言參考混淆

我的想法是,當我索引標題和內容時,我需要根據目前的令牌是否是關鍵字短語或其任何同義詞的一部分。

這是最好的方法嗎?非常感謝提前:)

回答

1

我認爲你可以使用WhitespaceTokenizer,然後插入一個KeywordMarkerFilter標記爲'不可侵犯的'一些標記,並最終提供自己的過濾器,將刪除標點符號。也許有了解Lucene.Net的人會提出一些建議;例如可以使用Solr WordDelimiterFilter

+0

阿圖爾·您好,感謝您的回答。我相信/認爲KeywordMarkerFilter是在3.1版本中引入Java API的 - 目前不支持.net作爲2.9.2版本是最新版本。不過,我認爲你所建議的是我正在考慮的,即使用自定義標記器在.net中模擬它。再次感謝:) – eslsys

+0

你是對的我從Lucene的角度回答了這個問題,希望它有幫助。 –

+0

謝謝阿圖爾,絕對有幫助,因爲它有助於縮小我的方法中的潛在選項。如果其他人有觀點,我會在幾天後再提問。再次感謝 – eslsys

2

標記器的自定義可以通過下面提到的類之一來完成:

1)。 2)。Lucene.Net.Analysis.CharTokenizer 2)。 Lucene.Net.Analysis.Tokenizer

public class AlphaNumbericTokenizer : Lucene.Net.Analysis.CharTokenizer 
{ 
    public AlphaNumbericTokenizer (System.IO.TextReader input) : base(input) 
    { 
    } 
    protected override bool IsTokenChar(char c) 
    { 
     //TODO: Logic for identifying token or token separator 
     return char.IsLetterOrDigit(c); 
    } 
} 

請參考,http://karticles.com/NoSql/lucene_custom_tokenizer.html

+0

我在解決這個問題時採用了一種稍微不同的路線 - 我會在博客文章中寫下它,並在此處鏈接並提供解決方案的大綱。感謝您的答案vrluckyin :) – eslsys