2012-01-26 148 views
0

我正在使用Lucene搜索作業現場,並用這樣的問題應對。我需要搜索C#,.net所以我需要使用WhiteSpaceAnalyzer,但是如果我使用它,搜索將是情況感性的。Lucene的自定義分析

我怎麼能做出這種情況下insensative?現在我看到只有一個解決方案是製作自己的分析器。但我是Lucene的新手,能否請你幫我解決一些代碼示例。我做了一些我認爲必須工作的東西,但事實並非如此。看

public sealed class NewWhitespaceAnalyzer : Analyzer 
    { 
     public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader) 
     { 
      return new LowerCaseFilter(new WhitespaceTokenizer(reader)); 
     } 

     public override TokenStream ReusableTokenStream(System.String fieldName, System.IO.TextReader reader) 
     { 
      Tokenizer tokenizer = (Tokenizer)GetPreviousTokenStream(); 
      if (tokenizer == null) 
      { 
       tokenizer = new WhitespaceTokenizer(reader); 
       SetPreviousTokenStream(tokenizer); 
      } 
      else 
       tokenizer.Reset(reader); 
      return tokenizer; 
     } 
    } 

如果你會在這裏看到錯誤,請糾正我。

如果您有任何其他建議,你是wlcome。

感謝您的幫助, 迪馬。

+0

什麼不起作用這段代碼? – Prescott

回答

3

試試這個:

public sealed class NewWhitespaceAnalyzer : Analyzer 
{ 
    public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader) 
    { 
     return new LowerCaseFilter(new WhitespaceTokenizer(reader)); 
    } 

    public override TokenStream ReusableTokenStream(System.String fieldName, System.IO.TextReader reader) 
    { 
     SavedStreams streams = (SavedStreams) GetPreviousTokenStream(); 
     if (streams == null) 
     { 
      streams = new SavedStreams(); 
      SetPreviousTokenStream(streams); 
      streams.tokenStream = new WhiteSpaceTokenizer(reader); 
      streams.filteredTokenStream = new LowerCaseFilter(streams.tokenStream); 
     } 
     else 
     { 
      streams.tokenStream.Reset(reader); 
     } 
     return streams.filteredTokenStream; 
    } 
} 
+0

我試過你的報價,但是id不工作。它甚至不保存任何文件。 – F0rc0sigan

+0

您可以檢查標記生成器和TokenFilters如何被稱爲在https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/src/core/Analysis/Standard/StandardAnalyzer.cs以獲得所需的行爲和嘗試編寫自己的分析器 – naresh

+0

您的代碼正在修復一個小錯誤:streams.filteredTokenStream = new LowerCaseFilter(streams.filteredTokenStream);替換爲streams.filteredTokenStream = new LowerCaseFilter(streams.tokenStream); – F0rc0sigan

0

有2點:

  • 使用LowerCaseFilter也在ReusableTokenStream方法。

  • 不要忘記在這兩個查詢分析和索引文件使用這個定製Analyzer

享受。

+0

你能寫一下如何使用的例子嗎? – F0rc0sigan