2013-09-28 2 views
0

(자세한 특정 문제 세부 정보는 업데이트입니다.) 문서 필드 값이 너무 깁니다. 이 필드의 토큰은 word | payload | position_increment 형식입니다. (나는 위치 증분과 페이로드를 수동으로 제어해야합니다.) 전체 문서에 대해이 복합 토큰을 수집 한 다음 '\ t'와 결합한 다음이 문자열을 내 사용자 정의 분석기로 전달합니다. (정말 긴 필드 문자열의 경우 ArrayOutOfBoundsException을 사용하여 UnicodeUtil.UTF16toUTF8()에서 내용이 깨집니다.Lucene 다중 값 필드 인덱싱

분석기는 다음과 같다 :

class AmbiguousTokenAnalyzer extends Analyzer { 
    private PayloadEncoder encoder = new IntegerEncoder(); 

    @Override 
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
     Tokenizer source = new DelimiterTokenizer('\t', EngineInfo.ENGINE_VERSION, reader); 
     TokenStream sink = new DelimitedPositionIncrementFilter(source, '|'); 
     sink = new CustomDelimitedPayloadTokenFilter(sink, '|', encoder); 
     sink.addAttribute(OffsetAttribute.class); 
     sink.addAttribute(CharTermAttribute.class); 
     sink.addAttribute(PayloadAttribute.class); 
     sink.addAttribute(PositionIncrementAttribute.class); 
     return new TokenStreamComponents(source, sink); 
    } 
} 

CustomDelimitedPayloadTokenFilter 및 DelimitedPositionIncrementFilter는 가장 오른쪽 'incrementToken'방법이 "| AAA"토큰의 일부가 처리됩니다. , 그것은 확인을 작동합니다 - 나는 분석기 (document.add (...)를 통해 하나의 큰 문자열) 분야 자체를 전달하는 경우 문제가되는

attributeFieldType.setIndexed(true); 
attributeFieldType.setStored(true); 
attributeFieldType.setOmitNorms(true); 
attributeFieldType.setTokenized(true); 
attributeFieldType.setStoreTermVectorOffsets(true); 
attributeFieldType.setStoreTermVectorPositions(true); 
attributeFieldType.setStoreTermVectors(true); 
attributeFieldType.setStoreTermVectorPayloads(true); 

:

필드는 다음과 같이 구성되어 있습니다 하지만 토큰 뒤에 토큰을 전달하면 검색 단계에서 문제가 발생합니다. 어딘가에서 읽었을 때,이 두 가지 방법은 색인 결과 관점에서 동일해야합니다. 어쩌면 내 분석기가 뭔가를 놓친 것일까?

UPDATE

여기에 더 자세히 내 문제는 다음과 같습니다 색인에 추가하여, 나는 그대로 저장되는 다중 값 필드가 필요합니다. 그리고 여러 원자 토큰으로 분석기에 전달하면 첫 번째 원소 만 저장합니다. 결국 모든 원자 토큰을 연결하도록 사용자 정의 분석기에 수행해야 할 작업은 무엇입니까?

답변

0

글쎄, 실제로 모든 값이 저장되어있는 것으로 나타났습니다. 여기 내가 인덱싱 후 무엇을 얻을 수 있습니다 :

indexSearcher.doc(0).getFields("gramm") 

stored,indexed,tokenized,termVector,omitNorms<gramm:S|3|1000> 
stored,indexed,tokenized,termVector,omitNorms<gramm:V|1|1> 
stored,indexed,tokenized,termVector,omitNorms<gramm:PR|1|1> 
stored,indexed,tokenized,termVector,omitNorms<gramm:S|3|1> 
stored,indexed,tokenized,termVector,omitNorms<gramm:SPRO|0|1000 S|1|0> 
stored,indexed,tokenized,termVector,omitNorms<gramm:A|1|1> 
stored,indexed,tokenized,termVector,omitNorms<gramm:SPRO|1|1000> 
stored,indexed,tokenized,termVector,omitNorms<gramm:ADV|1|1> 
stored,indexed,tokenized,termVector,omitNorms<gramm:A|1|1> 

그리고 "단일 필드"버전 getField()가 첫 번째 값을 반환 이유를 모르겠어요

indexSearcher.doc(0).getField("gramm") 

stored,indexed,tokenized,termVector,omitNorms<gramm:S|3|1000> 

하지만 보인다 내 필요 getFields() 괜찮습니다.