2014-02-24 2 views
0

내가 .NET 4.5을 실행하고 Lucene.Net 3.0.3 및 äa 대신 ae로 변환됩니다로 (움라우트-행동에 대한 ASCIIFoldingFilter를 "해결"하기 위해 노력하고 함께 MappingCharFilter을 어떻게 사용합니까 - 검색한다 예 : GeschäftGeschaeft은 모두 작동해야합니다.나는 Lucene.Net

지금은 같은 Lucene.Net.Analysis.MappingCharFilter -instance를 추가하는 시도
public sealed class LowerCaseKeywordAnalyzer : Lucene.Net.Analysis.KeywordAnalyzer 
{ 
    public override Lucene.Net.Analysis.TokenStream TokenStream(string fieldName, TextReader reader) 
    { 
     var keywordTokenizer = base.TokenStream(fieldName, reader); 
     var lowerCaseFilter = new Lucene.Net.Analysis.LowerCaseFilter(keywordTokenizer); 
     var asciiFoldingFilter = new Lucene.Net.Analysis.ASCIIFoldingFilter(lowerCaseFilter); 

     return asciiFoldingFilter; 
    } 
} 

가 : - 또는 TextReader

public sealed class LowerCaseKeywordAnalyzer : Lucene.Net.Analysis.KeywordAnalyzer 
{ 
    public override Lucene.Net.Analysis.TokenStream TokenStream(string fieldName, TextReader reader) 
    { 
     var keywordTokenizer = base.TokenStream(fieldName, reader); 
     var lowerCaseFilter = new Lucene.Net.Analysis.LowerCaseFilter(keywordTokenizer); 
     var mappingCharFilter = new Lucene.Net.Analysis.MappingCharFilter(/* get map from somewhere*/, ???); 
     var asciiFoldingFilter = new Lucene.Net.Analysis.ASCIIFoldingFilter(lowerCaseFilter); 

     return asciiFoldingFilter; 
    } 
} 

하지만 어떻게 내가 중 하나 CharStream 주입 않는다 -

나는 이미 내 분석기를 구현 예? 나는 Lucene.Net.Analysis.TokenStream -instance (Lucene.Net.Analysis.LowerCaseFilter 또는 base.TokenStream()) 중 하나를 가지고 있습니다 ...
작업을 수행하는 사용자 정의 Lucene.Net.Analysis.TokenFilter을 작성하는 경우를 제외하고는이 작업을 수행 할 수있는 기회가 있습니까?

답변

2

나는 Lucene.Net.Analysis.TokenFilter 내 자신의 구현 : 여기에

public sealed class UmlautsFoldingFilter : Lucene.Net.Analysis.TokenFilter 
{ 
    private readonly Lucene.Net.Analysis.Tokenattributes.ITermAttribute _termAttribute; 
    private char[] _output = new char[512]; 
    private int _outputPosition; 

    public UmlautsFoldingFilter(Lucene.Net.Analysis.TokenStream input) 
     : base(input) 
    { 
     this._termAttribute = this.AddAttribute<Lucene.Net.Analysis.Tokenattributes.ITermAttribute>(); 
    } 

    public override bool IncrementToken() 
    { 
     if (!this.input.IncrementToken()) 
     { 
      return false; 
     } 

     var termBuffer = this._termAttribute.TermBuffer(); 
     var termLength = this._termAttribute.TermLength(); 

     this.FoldUmlaut(termBuffer, 
         termLength); 

     this._termAttribute.SetTermBuffer(this._output, 
              0, 
              this._outputPosition); 

     return true; 
    } 

    private void FoldUmlaut(char[] termBuffer, 
          int termLength) 
    { 
     var targetSize = 4 * termLength; 
     if (this._output.Length < targetSize) 
     { 
      this._output = new char[Lucene.Net.Util.ArrayUtil.GetNextSize(targetSize)]; 
     } 
     this._outputPosition = 0; 
     for (var index = 0; 
      index < termLength; 
      ++index) 
     { 
      var ch = termBuffer[index]; 
      switch (ch) 
      { 
       case 'Ä': 
        this._output[this._outputPosition++] = 'A'; 
        this._output[this._outputPosition++] = 'E'; 
        continue; 
       case 'Ö': 
        this._output[this._outputPosition++] = 'O'; 
        this._output[this._outputPosition++] = 'E'; 
        continue; 
       case 'Ü': 
        this._output[this._outputPosition++] = 'U'; 
        this._output[this._outputPosition++] = 'E'; 
        continue; 
       case 'ä': 
        this._output[this._outputPosition++] = 'a'; 
        this._output[this._outputPosition++] = 'e'; 
        continue; 
       case 'ö': 
        this._output[this._outputPosition++] = 'o'; 
        this._output[this._outputPosition++] = 'e'; 
        continue; 
       case 'ü': 
        this._output[this._outputPosition++] = 'u'; 
        this._output[this._outputPosition++] = 'e'; 
        continue; 
       default: 
        this._output[this._outputPosition++] = ch; 
        continue; 
      } 
     } 
    } 
} 
0

오래된 질문에 대한 답변을하지만, 원래의 대답은 Lucene.net의 NormalizeCharMap의 사용을 표시하지 않는 한, 그럼에도 불구하고 관련이있을 수 있습니다.

public override TextReader InitReader(string fieldName, TextReader reader) 
    { 
     NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder(); 
     builder.Add("Ä", "AE"); 
     builder.Add("ä", "ae"); 
     builder.Add("Ö", "OE"); 
     builder.Add("ö", "oe"); 
     builder.Add("Ü", "UE"); 
     builder.Add("ü", "ue"); 
     return new MappingCharFilter(builder.Build(), reader); 
    } 

이 당신에게 필요한 대체/normlizations를 제공해야합니다 또한 분석기 클래스 재정의이 같은 InitReader에서 .