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
의문점은 분석기를 디버깅 할 때 입력 문자열을 올바르게 토큰 화하여 하나가 아닌 두 개의 토큰을 반환한다는 것입니다.
무슨 일입니까?
감사합니다.
는 분석 전에 텍스트를 취급 쿼리 파서는, 그래서 F에 펀칭됩니다 최상의 경우에 "foo는 바"foo는/바 채우기 아마 F와 같은 구문 쿼리에 결국 쿼리 구문 분석기 토큰에서 여러 개의 분석기 토큰 가져 오기 –