(자세한 특정 문제 세부 정보는 업데이트입니다.) 문서 필드 값이 너무 깁니다. 이 필드의 토큰은 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
여기에 더 자세히 내 문제는 다음과 같습니다 색인에 추가하여, 나는 그대로 저장되는 다중 값 필드가 필요합니다. 그리고 여러 원자 토큰으로 분석기에 전달하면 첫 번째 원소 만 저장합니다. 결국 모든 원자 토큰을 연결하도록 사용자 정의 분석기에 수행해야 할 작업은 무엇입니까?