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"
).
내가 놓친 것?
쿼리는 간단하다 당신은 또한 다양한 입력을 요구하는 방법을 여러 번
incrementToken
방법 안에 뭔가를 인쇄하여 볼 수, 디버그 조치로 최종return true;
문전에이 코드를 추가하십시오 'Body : "testDocument"'; 온라인 샘플이 있거나 '_termAtt' 및 위치를 올바르게 설정하는 방법을 설명 할 수 있습니까? – danyolgiax
나의 답변 : 편집 됨 –
Thx! 당신이 그것을 설명하는대로 작동합니다! ... 나는 IncrementToken 메서드에서 적은 호출로 동일한 작업을 수행하는 코드 속도를 향상시킵니다. 논리는 똑같아 보인다. (훨씬 빠르다.) 진정한 차이는 어디 있는가? – danyolgiax