2012-01-26 69 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