2014-06-23 2 views
0

"/" 문자로 용어를 분리하기 위해 분석기에 맞춤 필터를 만들었습니다.Lucene의 맞춤 필터

"testDocument Test/mystring/2014"과 같은 문자열을 포함하는 문서는 예를 들어 "test mystring" 또는 "mystring 2014"과 같이 검색 할 수 있습니다.

public class MyDelimiterFilter : TokenFilter 
{ 

    private readonly ITermAttribute _termAtt; 
    private readonly IPositionIncrementAttribute _positionAtt; 
    private readonly Queue<char[]> _terms; 

    public WordDelimiterFilter(TokenStream inStream) 
     : base(inStream) 
    { 
     _termAtt = AddAttribute<ITermAttribute>(); 
     _positionAtt = AddAttribute<IPositionIncrementAttribute>(); 
     _terms = new Queue<char[]>(); 
    } 

    public override bool IncrementToken() 
    { 
     if (_terms.Count != 0) 
     { 
      var buffer = _terms.Dequeue(); 

      _termAtt.SetTermBuffer(buffer,0,buffer.Length); 
      _positionAtt.PositionIncrement = 1; 
      return true; 
     } 

     if (!input.IncrementToken()) 
     { 
      return false; 
     } 

     if (_termAtt.Term.Contains("/")) 
     { 
      var tempArray = _termAtt.Term.Split('/'); 
      foreach (var item in tempArray) 
      { 
       _terms.Enqueue(item.ToCharArray()); 
      } 
     } 
     else 
     { 
      _terms.Enqueue(_termAtt.Term.ToCharArray()); 
     } 

     return true; 
    } 
} 

나는이 코드를 디버깅 할 수 있습니다 및 로직 경로가 올바른지 보인다

나는 다음 필터를 구현했습니다. 검색을 시도하면 "testDocument" 또는 "Test/mystring/2014" 인 문서가 있지만 결과는 0입니다 (예 : "mystring").

내가 놓친 것?

답변

0

이 부분 :

if (_termAtt.Term.Contains("/")) 
    { 
     var tempArray = _termAtt.Term.Split('/'); 
     foreach (var item in tempArray) 
     { 
      _terms.Enqueue(item.ToCharArray()); 
     } 
    } 
    else 
    { 
     _terms.Enqueue(_termAtt.Term.ToCharArray()); 
    } 

    return true; 

가에 _termAtt을 설정하는 로직을 포함하지 않는 적절한 값, 또는 위치를 증가합니다. 이런 식으로하는 것보다 incrementToken에서 진실을 반환 할 것입니다. 쿼리 개체의 toString 메서드에서 텍스트를 제공 할 수 있습니까?

EDIT : 간단한 용어 쿼리 대신 문구 쿼리가 반환되는 것 같습니다.

+0

쿼리는 간단하다 당신은 또한 다양한 입력을 요구하는 방법을 여러 번 incrementToken 방법 안에 뭔가를 인쇄하여 볼 수, 디버그 조치로 최종 return true;

var buffer = _terms.Dequeue(); _termAtt.SetTermBuffer(buffer,0,buffer.Length); _positionAtt.PositionIncrement = 1; 

전에이 코드를 추가하십시오 'Body : "testDocument"'; 온라인 샘플이 있거나 '_termAtt' 및 위치를 올바르게 설정하는 방법을 설명 할 수 있습니까? – danyolgiax

+0

나의 답변 : 편집 됨 –

+0

Thx! 당신이 그것을 설명하는대로 작동합니다! ... 나는 IncrementToken 메서드에서 적은 호출로 동일한 작업을 수행하는 코드 속도를 향상시킵니다. 논리는 똑같아 보인다. (훨씬 빠르다.) 진정한 차이는 어디 있는가? – danyolgiax