2013-09-28 193 views
0

更具體的問題詳細信息如下更新)我有很長的文檔字段值。這些字段的標記形式爲: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

這是我更詳細的問題:除了索引,我需要多值字段被原樣保存。如果我將它作爲多個原子標記傳遞給分析器,它只存儲其中的第一個。 我需要對自定義分析器做些什麼才能讓它存儲最終連接的所有原子令牌?

回答

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> 

與「單場」版本

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

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

我不知道爲什麼getfield命令()只返回第一個值,但似乎爲我的需要getFields()是好的。