2013-03-02 3 views
1

"단어"와 "줄기"기능이있는 문서가 있습니다. 한 단어에는 여러 개의 줄기가있을 수 있으므로 위치 증분을 조작하는 "줄기"기능의 색인을 만듭니다.Lucene setPositionIncrement가 작동하지 않습니다.

FieldType type = new FieldType(); 
type.setIndexed(true); 
type.setStored(true); 
type.setOmitNorms(true); 
type.setTokenized(true); 
type.setStoreTermVectorOffsets(true); 
type.setStoreTermVectorPositions(true); 
type.setStoreTermVectors(true); 

String join_token = tok.nextToken(); // token is like "stem1 stem2 stem3" 
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, new StringReader(join_token)); 
PositionIncrementAttribute attr = stream.addAttribute(PositionIncrementAttribute.class); 
attr.setPositionIncrement(0); 
stream.addAttribute(OffsetAttribute.class); 
stream.addAttribute(CharTermAttribute.class); 
feature = new Field(name, 
        join_token, 
        type); 
feature.setTokenStream(stream); 
doc.add(feature); 

당신은 그것을 저장할 수 있도록 내가 고정 문자열 값으로 필드를 초기화 코드에서보고, 다음으로 토큰 스트림을 통과 (나는 여기 어딘가에 유래에서 그 해결책을 발견) : 나는 다음과 같이 그렇게 . 줄마다 각 join_token에 대해 이러한 정확한 단계를 수행합니다. 그 결과, 나는 TermVector에서 누가 복음에 나오는 나의 말을 지켜 본다. 하나의 단어에 대한 여러 줄기가 연속적으로 나타난다. 무엇이 잘못 되었나요?

+0

입니까? – phani

답변

1

실제로는 TokenStream을 초기화하지 않아서 attr.setPositionIncrement(0); 일 때 스트림의 각 토큰에 대해 설정하지 않도록 문제가있는 것 같습니다. 이 작업을 수동으로 수행하려는 경우 스트림의 각 토큰에 대해 반복해야하고 각 토큰에 대해 setPositionIncrement(0)을 반복해야합니다.

그러나 대신 PositionFilter을 사용해 볼 수 있습니다. 스트림이 소비 될 때 위치 증분 설정을 0으로 처리합니다.

이 다음과 같을 것이다 : 그들은 '위치'값이나 '오프셋'값의 측면에서 연속

String join_token = tok.nextToken(); // token is like "stem1 stem2 stem3" 
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, new StringReader(join_token)); 
stream = new PositionFilter(stream, 0); // 0 also happens to be the default 
관련 문제