使用Custom Document Transformer获取solr中匹配项的有效负载

时间:2016-05-10 22:08:53

标签: solr lucene zend-search-lucene solr5 compass-lucene

在Solr中,我有一个名为“payloads”的自定义fieldType,它支持有效负载

<fieldtype name="payloads" stored="true" indexed="true" class="solr.TextField" >
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="com.abc.CustomPayloadTokenFilterFactory" encoder="custom"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldtype>      

我已经定义了这种类型的字段:

<field name = "somefield" type="payloads" indexed="true" stored="true"  multiValued = "true" omitNorms="true" />

“somefield”的内容如下: [“abcd | payload1”,“xyz | payload2”,“mnop | payload3”](可以扩展到1K字)

假设我的查询字词是“xyz”。我想只返回“xyz | payload2”或更好的“payload2”。

我在Solr中编写了一个自定义DocumentTransformer,它将文档与我的查询匹配后可以解析该字段并返回“payload2”。

但是如果感觉我应该能够提取“payload2”而不必解析整个字段,因为内部solr可能会将此信息编入索引。

我正在尝试编写另一个Document Transformer,它只能使用PostingsEnum返回有效负载:

IndexReader reader = this.context.getSearcher().getIndexReader();
final TermsEnum termsEnum = MultiFields.getTerms(
    reader, this.kField).iterator();
String term = "xyz";
PostingsEnum postingsEnum = MultiFields.getTermDocsEnum(
    reader,
    "somefield",
    new BytesRef(term));

if (termsEnum.seekExact(new BytesRef(term))) {
    PostingsEnum pe = termsEnum.postings(postingsEnum, PostingsEnum.ALL);

    int nextDoc = pe.advance(docid);
    postingsEnum.advance(docid);

    if (nextDoc == docid) { 
        if (sb.length() > 0)
            sb.append(",");
        sb.append(term );
        sb.append(pe.getPayload());
    }
}

但是当我做“pe.getPayload()”时,我只是得到了“null”。 关于上述代码可能出现什么问题以及有效负载不存在的原因的任何建议/指示?

(注意:所呈现的场景非常简单,实际上文档和查询中还存在其他内容,因此请不要建议更改架构或不使用有效负载。)

0 个答案:

没有答案