(更具體的問題詳細信息如下更新)我有很長的文檔字段值。這些字段的標記形式爲:word | payload | position_increment。 (我需要手動控制位置增量和有效負載。) 我爲整個文檔收集這些複合標記,然後將它們與'\ t'結合,然後將此字符串傳遞給我的自定義分析器。 (對於UnicodeOtil.UTF16toUTF8()和ArrayOutOfBoundsException異常情況下的真正長字段字符串)。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」的令牌的一部分被處理。
場配置爲:
attributeFieldType.setIndexed(true);
attributeFieldType.setStored(true);
attributeFieldType.setOmitNorms(true);
attributeFieldType.setTokenized(true);
attributeFieldType.setStoreTermVectorOffsets(true);
attributeFieldType.setStoreTermVectorPositions(true);
attributeFieldType.setStoreTermVectors(true);
attributeFieldType.setStoreTermVectorPayloads(true);
問題是,如果我傳遞給分析儀領域本身(一個巨大的字符串 - 通過document.add(...)),它的工作原理確定,但是如果我在令牌之後傳遞令牌,則在搜索階段會有某些內容中斷。 當我在某處閱讀時,從最終的索引角度來看,這兩種方式必須相同。也許我的分析儀錯過了什麼?
UPDATE
這是我更詳細的問題:除了索引,我需要多值字段被原樣保存。如果我將它作爲多個原子標記傳遞給分析器,它只存儲其中的第一個。 我需要對自定義分析器做些什麼才能讓它存儲最終連接的所有原子令牌?