2014-06-17 9 views
0

나는 매우 단순한 분석기을 사용하여 슬래시 (/)를 공백으로 대체하려고합니다. QueryParser은 파싱하기 전에 슬래시로 문자열을 이스케이프 처리해야하므로 "\ /"을 단일 공백으로 바꾸는 분석기에 MappingCharFilter을 추가했습니다.Lucene QueryParser 분석기 불일치

@Override 
protected TokenStreamComponents createComponents(String field, Reader in) { 
    NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder(); 
    builder.add("\\/", " "); 
    Reader mappingFilter = new MappingCharFilter(builder.build(), in); 

    Tokenizer tokenizer = new WhitespaceTokenizer(version, mappingFilter); 
    return new TokenStreamComponents(tokenizer); 
} 

은 그럼 대시 문자열을 구문 분석 QueryParser이 분석기를 사용합니다 :

String text = QueryParser.escape("one/two"); 
QueryParser parser = new QueryParser(Version.LUCENE_48, "f", new MyAnalyzer(Version.LUCENE_48)); 
System.err.println(parser.parse(text)); 

예상 출력이 될 것

f:one f:two 

그러나, 다음과 같이 분석기는 정의된다 알겠습니다 :

f:one/two 

의문점은 분석기를 디버깅 할 때 입력 문자열을 올바르게 토큰 화하여 하나가 아닌 두 개의 토큰을 반환한다는 것입니다.

무슨 일입니까?

감사합니다.

+0

는 분석 전에 텍스트를 취급 쿼리 파서는, 그래서 F에 펀칭됩니다 최상의 경우에 "foo는 바"foo는/바 채우기 아마 F와 같은 구문 쿼리에 결국 쿼리 구문 분석기 토큰에서 여러 개의 분석기 토큰 가져 오기 –

답변

0

매우 간단한 해결책입니다. builder.add 메소드의 첫 번째 인수에서 앞 슬래시 문자를 이스케이프하지 마십시오. 그냥 알다시피

builder.add("/", " ");