Lucene多值字段索引

时间:2013-09-28 21:03:48

标签: java lucene indexing search-engine

更新中的更具体的问题详细信息)我有很长的文档字段值。这些字段的标记具有以下形式:word | payload | position_increment。 (我需要手动控制位置增量和有效负载。) 我收集整个文档的这些复合标记,然后用'\ t'连接它们,然后将此字符串传递给我的自定义分析器。 (对于非常长的字段字符串,使用ArrayOutOfBoundsException在UnicodeUtil.UTF16toUTF8()中出现问题。)

分析仪如下:

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(...))传递给分析器,它可以正常工作,但如果我在令牌之后传递令牌,则会在搜索阶段中断。 当我在某处读到时,从结果索引的角度来看,这两种方式必须相同。也许我的分析仪遗漏了什么?

更新

这是我的问题更详细:除了索引之外,我还需要按原样存储多值字段。如果我将它作为多个原子令牌传递给分析器,它只存储第一个原子令牌。 我需要对自定义分析器做什么才能使它最终存储连接的所有原子令牌?

1 个答案:

答案 0 :(得分: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()没问题。